在C#中,String和string有什么区别?
在C#中,String和string有什么区别?
这两个有什么区别,我应该使用哪一个?
string s = "Hello world!"; String s = "Hello world!";
为了完整起见,这里是相关信息的脑力倾泻...
正如其他人指出的那样,string
是 System.String
的别名。假设你的代码使用 String
编译成了 System.String
(即你没有使用某个不同的命名空间中具有不同 String
类型的 using 指令),它们编译成相同的代码,因此在执行时根本没有任何区别。这只是 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
这只是规范定义枚举声明的一种方式 - 冒号后面的部分必须是 integral-type production,它是 sbyte
、byte
、short
、ushort
、int
、uint
、long
、ulong
或 char
的一个标记...与变量声明使用的类型不同。这并不表示任何其他区别。
最后,关于使用哪个:个人使用别名实现,但在任何 API 中使用 CLR 类型。在实现方面,使用哪个并不太重要 - 团队内的一致性很好,但其他人并不在乎。另一方面,如果在 API 中引用类型,以语言中立的方式这样做是真正重要的。例如,名为 ReadInt32
的方法是明确的,而名为 ReadInt
的方法需要解释。调用方可能使用一个将 int
别名定义为 Int16
的语言。.NET 框架的设计者遵循了这个模式,在 BitConverter
、BinaryReader
和 Convert
类中有很好的例子。
string
是 C# 中 System.String
的别名。
因此,在技术上没有区别。这就像 int
vs. System.Int32
一样。
至于指导方针,一般建议在引用对象时使用 string
。
例如:
string place = "world";
同样地,如果需要特定地引用该类,则一般建议使用 String
。
例如:
string greet = String.Format("Hello {0}!", place);
这是 Microsoft 在 它们的示例 中倾向于使用的风格。
在这个领域的指导似乎已经发生了变化,因为 StyleCop 现在强制使用 C# 特定的别名。