【问题标题】:c#: difference between "System.Object" and "object"c#:“System.Object”和“object”之间的区别
【发布时间】:2010-11-04 06:35:46
【问题描述】:

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

为什么一种形式比另一种更受欢迎?

【问题讨论】:

  • 我是这样做的:我在原始变量(例如 int x = 0)的上下文中使用 int 或 string,并在类的上下文中使用 Int32 和 String 等(例如 Int32. Parse 或 String.Empty) - 虽然没有任何区别,但最终它会被编译为相同的 CLR 类型。
  • 你为什么不把它作为答案发布?
  • 这是一个与此类似的问题-stackoverflow.com/questions/981434/…

标签: c# coding-style


【解决方案1】:

stringglobal::System.String 的别名。它只是语法糖。两者完全在几乎所有情况下都可以互换,编译后的代码不会有任何区别。

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

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

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

(请注意,返回类型并不是真正的名称 - 它在元数据中被编码为类型,因此不会造成混淆。)

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

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

【讨论】:

  • 关于公共 API 语言中立性的评论确实很有趣!
  • 为了让 FxCop 闭嘴,这样做是值得的
  • 公共 API 的语言中立性是 .NET 库的工作量。
  • @Stilgar 我指的不是字符串。如果没有意义,请查看我对 Jon 的回答的评论 - stackoverflow.com/questions/981434/…
  • @Stilgar:这就是为什么我的答案使用 int/Int32 而不是 string/String。是的,对于 String/Object/Decimal/Double/Byte/SByte 来说无关紧要 - 但对于其他所有方面来说都很重要。
【解决方案2】:

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

查看此MSDN 页面了解所有详细信息。

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

【讨论】:

    【解决方案3】:

    一个是另一个的别名。它归结为风格。

    【讨论】:

      【解决方案4】:

      stringglobal::System.String 的别名,objectglobal::System.Object 的别名

      如果你的班级中有using System;String / stringObject / object 在功能上是相同的,并且用法是风格问题。

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

      【讨论】:

      • "String" 大写字母对 C# 编译器或 C# 语言没有任何意义。 "string" always 对应于 global::System.String。我不知道原作者从哪里得到“字符串”具有特殊含义的概念。
      【解决方案5】:

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

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

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

      【讨论】:

      • -1 这是不正确的。 string 和 System.String 是完全可以互换的。 string 只是 System.String 的别名
      • 这是正确的,我从未说过它们不同。 string 是指向 System.String 的关键字。也许我不清楚。
      • 其实我很清楚,“在实践中没有区别……”
      【解决方案6】:

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

      大写的命名风格是ISO命名规则。它更普遍,更常见;对源代码中的所有对象强制使用相同的命名规则,C# 编译器除外。

      【讨论】:

      • 那篇文章写得不好,在那里使用了“原始”这个词。如果您查看 Type.IsPrimitive 的文档,您会看到:“原始类型是 Boolean、Byte、SByte、Int16、UInt16、Int32、UInt32、Int64、UInt64、IntPtr、UIntPtr、Char、Double 和 Single。”请注意,此包括字符串、小数和对象,但确实包括 IntPtr 和 UIntPtr。
      • (它也以一种非常快速和松散的方式使用“对象”这个词。这是一篇通常写得不好的文章,IMO。)
      • 也许更好的术语是“关键字数据类型”?
      • 或 C# 语言规范术语:别名。
      【解决方案7】:

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

      但是要注意String和string是有区别的(c#区分大小写)

      【讨论】:

      • 它们有什么区别?
      • 尝试使用“String”而不使用“using System;”指令:)
      • @Jon 你更喜欢使用哪个?
      • @IanC:我通常使用别名。
      【解决方案8】:

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

      虽然 StyleCop 确实强制使用遗留的 C 样式别名,但它对原本合乎逻辑的规则集来说是一个瑕疵。到目前为止,我还没有听到任何不基于教条的规则(SA1121)的理由。如果您认为 SA1121 是合乎逻辑的,那么为什么 datetime 没有内置类型?

      【讨论】:

        猜你喜欢
        • 2023-03-11
        • 2010-12-05
        • 2010-11-28
        • 1970-01-01
        • 2012-04-04
        • 2012-04-17
        • 2012-12-12
        • 2019-04-25
        相关资源
        最近更新 更多