c#:“ System.Object”和“ object”之间的区别


73

在C#中,System.Object在代码中使用而不是objectSystem.String而不是string,等等之间有什么区别吗?还是仅仅是风格问题?

有一种理由为什么一种形式优于另一种形式?


5
我是这样做的:我在原始变量的上下文中使用int或string(例如int x = 0),而在类的上下文中使用Int32和String等(例如Int32.Parse或String.Empty)-不会但是没有任何区别,最终它被编译为相同的CLR类型。
Tamas Czinege,2009年

2
您为什么不张贴它作为答案?
Paolo Tedesco,2009年

1
这是这单一个类似的问题stackoverflow.com/questions/981434/...
RichardOD

Answers:


71

string是的别名global::System.String。它只是语法糖。两者正好在几乎所有情况下可以互换的,而且会在编译的代码没有什么区别。

我个人使用别名来表示变量名等,但是我将CLR类型名用作API中的名称,例如:

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

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

(请注意,返回类型实际上不是名称-它在元数据中被编码为一种类型,因此这里没有混淆。)

我知道一个可以使用而另一个(我知道)不能使用的地方是:

  • nameof 禁止使用别名
  • 指定枚举基础基础类型时,只能使用别名

10
关于公共API的语言中立性的评论确实非常有趣!
Paolo Tedesco,2009年

3
这是很值得这样做只是关闭的FxCop起来
帕特里克·麦克唐纳

1
公共API的语言中立性是.NET库的工作量。
yfeldblum

1
@Stilgar我不是指String。看看我在乔恩的答案在这里评论,如果它没有正义- stackoverflow.com/questions/981434/...
RichardOD

2
@Stilgar:这就是为什么我的答案使用int / Int32而不是string / String的原因。是的,对于String / Object / Decimal / Double / Byte / SByte无关紧要-但对于其余所有内容都很重要。
乔恩·斯基特

8

对象类型是别名System.Object的。使用对象类型并将其显示为关键字。我认为这与遗产有关,但这只是一个疯狂的猜测。

请查看此MSDN页面以获取所有详细信息。

我更喜欢使用小写版本,但没有特殊原因。只是因为这些“基本”类型上的语法突出显示是不同的,并且键入时我不必使用Shift键...



3

string为别名global::System.String,并且objectglobal::System.Object

如果您using System;在课堂上拥有,String/stringObject/object在功能上是相同的,并且用法只是样式问题。

(编辑:根据乔恩·斯基特的评论,删除了引人误解的报价


3
大写字母的“字符串”对C#编译器或C#语言没有任何意义。“字符串”始终对应于global :: System.String。我不知道原始作者在哪里得到“字符串”具有特殊含义的概念。
乔恩·斯基特

1

string(带有小写的“ s”)是C#语言的字符串类型,并且该类型System.Stringstring.NET框架中的实现。

在实践中,除了风格上没有什么区别。

编辑:由于以上内容显然不够清楚,它们之间没有区别,一旦编译它们就是同一类型。我正在解释编译器看到的语义差异(这只是语法糖,很像while和for循环之间的差异)。


-1这是不正确的。字符串和System.String完全可以互换。string只是System.String的别名
西蒙P史蒂文斯

1
这是正确的,我从未说过它们是不同的。string是指向System.String的关键字。也许我不清楚。
马修·沙利

1
实际上,我非常清楚,“实际上没有区别……”
Matthew Scharley 2009年

0

没有区别。有许多类型称为原始数据类型,它们以您提到的样式受到编译器的威胁。

大写命名方式是ISO命名规则。更一般,更常见;对源中的所有对象强制使用相同的命名规则,而C#编译器则没有例外。


1
那篇文章写得不好用那里的“原始”一词。如果查看Type.IsPrimitive的文档,则会看到:“基本类型为Boolean,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,UInt64,IntPtr,UIntPtr,Char,Double和Single。” 请注意,这包括字符串,小数和对象,但包括的IntPtr和UIntPtr。
乔恩·斯基特

1
(它也以一种非常宽松的方式使用“对象”一词。这是一篇写得不好的文章,IMO。)
Jon Skeet

也许更好的术语是“关键字数据类型”?
马修·沙利

1
或C#语言规范术语:别名。
乔恩·斯基特

0

据我所知,我知道这是一个快捷方式,使用字符串比使用System.string更容易。

但请注意,字符串和字符串之间有区别(C#区分大小写)


2
他们之间有什么区别?
abatishchev

3
尝试在不使用“使用系统”的情况下使用“字符串”;指令:)
Jon Skeet

@Jon您更喜欢使用哪个?
IamIC

@IanC:我通常使用别名。
乔恩·斯基特

0

为难以适应数据类型不是语言固定部分的想法的工程师提供了objectintlongbool作为培训平台。C#与之前的语言不同,它对可以添加的数据类型数量没有限制。“系统”库提供了一个入门工具包,其中包含诸如System.Int32System.BooleanSystem.Double System.DateTime之依此类推,但鼓励工程师添加自己的。因为Microsoft对快速采用他们的新语言感兴趣,所以他们提供了别名,使它看起来像是更像“ C”的语言,但是这些别名是完全可抛弃的功能(如果您使用C#,它将是一种很好的语言。删除了所有内置别名,可能更好)。

尽管StyleCop确实强制使用了传统的C样式别名,但对于本应合理的规则集,这是一个缺陷。到目前为止,我还没有听说过此规则(SA1121)的单一理由,该理由不基于教条。如果您认为SA1121符合逻辑,那么为什么datetime没有内置类型?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.