示例(注意这个案子):
string s = "Hello world!";
String s = "Hello world!";
什么是 方针 供各自使用?什么是 分歧?
示例(注意这个案子):
string s = "Hello world!";
String s = "Hello world!";
什么是 方针 供各自使用?什么是 分歧?
string
是C#中的别名 System.String
。
从技术上讲,没有区别。就像是 int
与 System.Int32
。
就指导方针而言,通常建议使用 string
任何时候你指的是一个物体。
例如
string place = "world";
同样,我认为通常建议使用 String
如果你需要专门参考这个班级。
例如
string greet = String.Format("Hello {0}!", place);
看来这个领域的指导可能已经改变了 了StyleCop 现在强制使用C#特定的别名。
仅仅为了完整起见,这里是相关信息的大脑转储......
正如其他人所说, string
是别名 System.String
。它们编译为相同的代码,因此在执行时没有任何区别。这只是C#中的别名之一。完整清单是:
object: System.Object
string: System.String
bool: System.Boolean
byte: System.Byte
sbyte: System.SByte
short: System.Int16
ushort: System.UInt16
int: System.Int32
uint: System.UInt32
long: System.Int64
ulong: System.UInt64
float: System.Single
double: System.Double
decimal: System.Decimal
char: System.Char
除了 string
和 object
,别名都是值类型。 decimal
是一种值类型,但不是CLR中的基本类型。唯一没有别名的原始类型是 System.IntPtr
。
在规范中,值类型别名称为“简单类型”。文字可用于每种简单类型的常量值;没有其他值类型具有可用的文字形式。 (与VB比较,允许 DateTime
文字,并且也有别名。)
你有一种情况 有 使用别名:明确指定枚举的基础类型时。例如:
public enum Foo : UInt32 {} // Invalid
public enum Bar : uint {} // Valid
这只是规范定义枚举声明的方式问题 - 冒号之后的部分必须是 整体式 生产,这是一个标志 sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, char
......而不是 类型 例如,变量声明使用的生产。它并不表示任何其他差异。
最后,当谈到使用它时:我个人在各处使用别名来实现,但是任何API都使用CLR类型。你在实施方面使用它并不重要 - 你的团队之间的一致性很好,但没有人会关心。另一方面,如果您在API中引用类型,则以语言中立的方式执行此操作,这一点非常重要。一种叫做的方法 ReadInt32
是明确的,而一种叫做的方法 ReadInt
需要解释。调用者可能正在使用定义的语言 int
别名 Int16
, 例如。 .NET框架设计者已经遵循了这种模式,很好的例子就在于 BitConverter
, BinaryReader
和 Convert
类。
String
代表 System.String
它是.NET Framework类型。 string
是别名 在C#语言中 System.String
。它们都被编译为 System.String
在IL(中级语言),所以没有区别。选择你喜欢的并使用它。如果你用C#编码,我更喜欢 string
因为它是C#类型的别名,并且是C#程序员所熟知的。
我可以这么说 (int
, System.Int32
) 等等..
我听说过在C#中使用提供的类型别名的最佳答案来自杰弗里里希特在他的书中 CLR通过C#。以下是他的3个理由:
- 我见过许多开发人员感到困惑,不知道是否使用 串 要么 串 在他们的代码中。因为在C#中,字符串(关键字)完全映射到System.String(一种FCL类型),所以没有区别,可以使用它们。
- 在C#中, 长 映射到 System.Int64,但用不同的编程语言, 长 可以映射到 INT16 要么 INT32。实际上,C ++ / CLI实际上确实是长期的 INT32。如果某人使用一种语言阅读源代码,如果他或她习惯于使用不同的编程语言进行编程,则很容易误解代码的意图。事实上,大多数语言甚至都不会对待 长 作为关键字,不会编译使用它的代码。
- FCL有许多方法,它们将类型名称作为其方法名称的一部分。例如, BinaryReader在 type提供诸如的方法 ReadBoolean, ReadInt32, ReadSingle等等,和 System.Convert type提供诸如的方法 ToBoolean, ToInt32, ToSingle, 等等。虽然编写下面的代码是合法的,但浮点线对我来说感觉非常不自然,并且线条不正确并不明显:
BinaryReader br = new BinaryReader(...);
float val = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good
所以你有它。我认为这些都非常好。但是,我发现自己在自己的代码中没有使用Jeffrey的建议。也许我太困在我的C#世界,但我最终试图使我的代码看起来像框架代码。
string
是一个保留字,但是 String
只是一个班级名称。
这意味着 string
不能单独用作变量名。
如果由于某种原因你想要一个名为的变量 串,你只会看到第一个这样的编译:
StringBuilder String = new StringBuilder(); // compiles
StringBuilder string = new StringBuilder(); // doesn't compile
如果你真的想要一个名为的变量名 串 您可以使用 @
作为前缀:
StringBuilder @string = new StringBuilder();
另一个重要区别:Stack Overflow以不同的方式强调它们。
有一点不同 - 你不能使用 String
无 using System;
预先。
它已在上面介绍过;但是,你不能使用 string
反思;你必须使用 String
。
System.String
是.NET字符串类 - 在C#中 string
是别名 System.String
- 所以在使用中它们是相同的。
至于指导方针,我不会陷入困境,只是使用你想要的任何东西 - 生活中有更重要的事情,无论如何代码都是一样的。
如果您发现自己构建系统,则需要指定您正在使用的整数的大小,因此倾向于使用 Int16
, Int32
, UInt16
, UInt32
然后它看起来可能更自然 String
- 当在不同的.net语言之间移动时,它可能使事情更容易理解 - 否则我会使用string和int。
我更喜欢资本化 .NET
格式化原因的类型(而不是别名)。该 .NET
类型的颜色与其他对象类型相同(毕竟,值类型是适当的对象)。
条件和控制关键字(如 if
, switch
,和 return
)是小写和深蓝色(默认情况下)。而且我宁愿在使用和格式方面没有分歧。
考虑:
String someString;
string anotherString;