views:

904

answers:

7

In C#, is there any difference between using System.Object in code rather than just object, or System.String rather than string and so on? Or is it just a matter of style?

Is there a reason why one form is preferrable to the other?

+4  A: 

One is an alias to the other. Its down to style.

John Nolan
+1  A: 

string is an alias for global::System.String, and object for global::System.Object

Providing you have using System; in your class, String / string and Object / object are functionally identical and usage is a matter of style.

(EDIT: removed slightly misleading quote, as per Jon Skeet's comment)

Colin Pickard
"String" with a capital letter doesn't have any meaning to the C# compiler or the C# language. "string" *always* corresponds to global::System.String. I don't know where the original author gets the notion that "String" has special meaning.
Jon Skeet
because of Java
bobobobo
A: 

There are no difference. There is a number of types, called Primitive Data Types which are threated by compiler in style you mentioned.

Capitalized naming style is ISO naming rule. It's more general, common; forces the same naming rules for all objects in the source without exceptions such C# compiler has.

abatishchev
That article is poorly written to use the word "primitive" there. If you look at the docs for Type.IsPrimitive you'll see: "The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single." Note that this *doesn't* include string, decimal and object, but *does* include IntPtr and UIntPtr.
Jon Skeet
(It also uses the word "object" in a pretty fast-and-loose way. It's a generally badly-written article, IMO.)
Jon Skeet
Perhaps a better term would be "Keyword Data Types"?
Matthew Scharley
Or the C# language spec term: aliases.
Jon Skeet
or C# Compiler Built-in Data Types..
abatishchev
A: 

As of my knowledge, I know that it's a shortcut, it's easier to use string, rather than System.string.

But be careful there's a difference between String and string (c# is case sensitive)

Omar Abid
What difference is there between them?
abatishchev
Try using "String" without a "using System;" directive :)
Jon Skeet
@Jon very true.
IanC
@Jon which do you prefer to use?
IanC
@IanC: I usually use the alias.
Jon Skeet
A: 

string (with the lowercase "s") is the string type of the C# language and the type System.String is the implementation of string in the .NET framework.

In practise there is no difference besides stylistic ones.

EDIT: Since the above obviously wasn't clear enough, there is no difference between them, they are the same type once compiled. I was explaining the semantic difference that the compiler sees (which is just syntactic sugar, much like the difference between a while and for loop).

Matthew Scharley
-1 This is incorrect. string and System.String are entirely interchangeable. string is simply an alias for System.String
Simon P Stevens
This is correct, and I never said they were different. string is a keyword that points at System.String. Perhaps I wasn't clear.
Matthew Scharley
Actually, I was very clear, "In practise there is no difference..."
Matthew Scharley
+17  A: 

string is an alias for global::System.String. It's simply syntactic sugar. The two are exactly interchangable, and there'll be no difference in the compiled code.

Personally I use the aliases for variable names etc, but I use the CLR type names for names in APIs, for example:

public int ReadInt32() // Good, language-neutral

public int ReadInt() // Bad, assumes C# meaning of "int"

(Note that the return type isn't really a name - it's encoded as a type in the metadata, so there's no confusion there.)

Jon Skeet
The remark about language neutrality for public APIs is very interesting indeed!
Paolo Tedesco
It's well worth doing this just to shut FxCop up
Patrick McDonald
Language neutrality for public APIs is how much of the .NET libraries work.
Justice
You can usually spot a C# former VB programmer when they use String instead of string (not that it matters).
RichardOD
I'm sure this is mentioned in another question, but I'll mention it for completeness. In CLR via C#, Jeffrey Ritcher recommends you always use the language neutral type names everywhere. However the defacto standard is as Jon describes.
RichardOD
This does not make sense. What language neutrality are we talking about. Whether it is a public API or not when compiled no one can tell if you used string or String
Stilgar
@Stilgar I wasn't referring to String. Look at my comment on Jon's answer here if it doesn't make sense- http://stackoverflow.com/questions/981434/can-anyone-give-me-a-really-good-reason-to-use-clr-type-names-instead-of-c-type
RichardOD
@Stilgar: That's why my answer used int/Int32 rather than string/String. Yes, it doesn't matter for String/Object/Decimal/Double/Byte/SByte - but it does matter for all the rest.
Jon Skeet
+1  A: 

The object type is an alias for System.Object. The object type is used and shown as a keyword. I think it has something to do with legacy, but that's just a wild guess.

Have a look at this MSDN page for all details.

I prefer the use of the lowercased versions, but for no special reasons. Just because the syntax highlighting is different on these "basic" types and I don't have to use the shift key when typing...

Sorskoot