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

时间:2009-06-19 10:18:50

标签: c# coding-style

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

为什么一种形式对另一种形式更有优势?

8 个答案:

答案 0 :(得分:67)

stringglobal::System.String的别名。这只是语法糖。在几乎所有情况下,两者都完全可互换,并且编译代码没有区别。

我个人使用别名作为变量名等,但我在API中使用CLR类型名称作为名称,例如:

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

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

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

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

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

答案 1 :(得分:7)

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

有关所有详细信息,请查看此MSDN页面。

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

答案 2 :(得分:6)

一个是另一个的别名。它的风格。

答案 3 :(得分:3)

stringglobal::System.String的别名,object的{​​{1}}

如果您的课程中global::System.Object using System; / Stringstring / Object在功能上完全相同,那么使用就属于风格。< / p>

(编辑:删除slightly misleading quote,根据Jon Skeet的评论)

答案 4 :(得分:1)

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

在实践中,除了风格之外没有区别。

编辑:由于上面的内容显然不够明确,因此它们之间没有区别,编译后它们是相同的类型。我在解释编译器看到的语义差异(这只是语法糖,很像是while和for循环之间的区别)。

答案 5 :(得分:0)

没有区别。有许多类型,称为Primitive Data Types,它们由您提到的样式编译器进行威胁。

大写命名样式是ISO命名规则。它更普遍,更常见;对源中的所有对象强制执行相同的命名规则,而没有C#编译器具有的异常。

答案 6 :(得分:0)

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

但请注意,String和string之间存在差异(c#区分大小写)

答案 7 :(得分:0)

对象 int long bool 训练轮的形式提供对于那些无法适应数据类型不是语言固定部分的想法的工程师而言。与之前使用的语言不同,C#对您可以添加的数据类型数量没有限制。 &#39;系统&#39; library提供了一个入门套件,其中包含 System.Int32 System.Boolean System.Double System.DateTime <等有用类型/ em>等等,但鼓励工程师添加自己的。因为微软有兴趣快速采用他们的新语言,所以他们提供的别名使得它看起来好像语言更像“C”类似,但这些别名是完全一次性的功能(C#就像如果你删除了所有的内置别名,可能会更好一种语言。

虽然StyleCop确实强制使用传统的C风格别名,但对于其他逻辑规则而言,这是一个瑕疵。到目前为止,我还没有听说过这条规则的单一理由(SA1121)并非基于教条。如果您认为SA1121是合乎逻辑的,那么为什么 datetime 没有buildin类型?