在c_中,在代码中使用System.Object与仅使用object或System.String而不使用string等有什么区别吗?还是只是风格问题?
为什么一种形式比另一种形式更受欢迎?
- 我是这样做的:我在基元变量(如in t x=0)的上下文中使用int或string,在类(如int32.parse或string.empty)的上下文中使用int32和string等,但最终它被编译为同一个clr类型并没有任何区别。
- 你为什么不把它作为答案贴出来?
- 这是一个类似的问题-stackoverflow.com/questions/981434/…
string是global::System.String的别名。这只是简单的句法糖分。这两者在几乎所有情况下都是完全可以互换的,编译后的代码也不会有什么不同。
我个人使用别名来表示变量名等,但我使用clr类型名来表示API中的名称,例如:
1 2 3
| public int ReadInt32() // Good, language-neutral
public int ReadInt() // Bad, assumes C# meaning of"int" |
(请注意,返回类型实际上不是一个名称——它在元数据中被编码为一个类型,因此没有混淆。)
我只知道一个地方可以使用,另一个不能使用(我知道)的地方是:
- nameof禁止使用别名
- 指定枚举基基础类型时,只能使用别名
- 关于公共API的语言中立性的评论确实很有趣!
- 为了让fxcop闭嘴,这样做是值得的。
- 公共API的语言中立性是.NET库工作的程度。
- 当C前VB程序员使用字符串而不是字符串(不重要)时,通常可以发现他们。
- 我相信这是在另一个问题中提到的,但为了完整起见,我会提到它。在clr via c_中,Jeffrey Ritcher建议您始终在任何地方使用非语言类型名。然而,Defacto标准如jon所述。
- 这没有道理。我们说的是什么语言中立?编译时它是否是公共API,没有人知道您使用的是字符串还是字符串
- @史迪加,我不是指弦。看看我对乔恩答案的评论,如果没有意义的话-stackoverflow.com/questions/981434/…
- @史迪加:这就是为什么我的答案使用int/int32而不是string/string。是的,对于字符串/对象/小数/双精度/字节/字节来说,这无关紧要,但对于其余的一切来说,它都无关紧要。
- @Jonskeet也许值得用nameof问题来更新你的答案,它允许Object和String等,但不允许他们的c像Object和String等。
- @马西米利亚诺克劳斯:完成。
对象类型是System.Object的别名。对象类型被使用并显示为关键字。我认为这与遗产有关,但这只是一个猜测。
有关所有详细信息,请参阅此msdn页。
我喜欢使用低成本的版本,但没有特殊原因。只是因为这些"基本"类型的语法突出显示不同,而且我在键入时不必使用SHIFT键…
一个是另一个的别名。它的风格。
string是global::System.String的别名,object是global::System.Object的别名。
如果你班上有using System;,string/string和object/object在功能上是相同的,并且用法是风格问题。
(编辑:根据乔恩·斯基特的评论,删除了有点误导性的引用)
- 带大写字母的"字符串"对C编译器或C语言没有任何意义。string"始终对应于global::system.string。我不知道原作者从哪里得到"字符串"有特殊意义的概念。
- 因为Java
string(小写"s")是C语言的字符串类型,System.String类型是.NET框架中string的实现。
在实践中,除了风格上的差异外,没有别的区别。
编辑:由于上面的内容显然不够清楚,它们之间没有区别,编译后它们是同一类型的。我在解释编译器看到的语义差异(这只是语法上的糖分,很像while和for循环之间的差异)。
- -1这是不正确的。字符串和系统。字符串完全可以互换。字符串只是System.String的别名
- 这是正确的,我从来没有说过它们是不同的。字符串是指向System.String的关键字。也许我不清楚。
- 实际上,我很清楚,"在实践中没有区别…"
对象、int、long和bool是为那些难以适应数据类型不是语言固定部分这一理念的工程师提供的培训工具。与之前的语言不同,C对您可以添加的数据类型数量没有限制。"System"库提供了一个入门工具包,其中包含诸如System.Int32、System.Boolean、System.Double、System.DateTime等有用的类型,但鼓励工程师自行添加。因为微软对快速采用他们的新语言很感兴趣,他们提供了别名,使其看起来更像C语言,但这些别名是完全可释放的功能(如果删除了所有内置别名,C语言可能会更好)。
虽然StyleCop确实强制使用传统的C样式别名,但它在其他逻辑规则集上是一个瑕疵。到目前为止,我还没有听到一个单一的理由为这个规则(SA1121)不是基于教条。如果您认为SA1121是逻辑的,那么为什么datetime没有buildin类型?
据我所知,我知道这是一个快捷方式,它更容易使用字符串,而不是System.String。
但是要小心,字符串和字符串之间有区别(C区分大小写)
- 他们之间有什么区别?
- 尝试使用"string"而不使用"using system;"指令:)
- 乔恩非常真实。
- @乔恩,你更喜欢用哪个?
- @IANC:我通常使用别名。
没有区别。有许多类型,称为基元数据类型,由编译器以您提到的样式进行线程化。
大写的命名样式是ISO命名规则。它更通用,更常见;强制对源代码中的所有对象使用相同的命名规则,而不存在C编译器所具有的异常。
- 那篇文章写得不好用"原始"这个词。如果查看type.isprimary的文档,您会看到:"基元类型是布尔型、字节型、sbyte型、int16型、uint16型、int32型、uint32型、int64型、uint64型、uint64型、intptr型、uintptr型、char型、double型和single型。"请注意,这不包括string、decimal型和object型,但包括intptr型和uintptr型。
- (它还以相当快和宽松的方式使用"对象"一词。在我看来,这篇文章写得一般都很糟糕。)
- 也许更好的术语是"关键字数据类型"?
- 或者C语言规范术语:别名。
- 或C编译器内置数据类型。