C#中的String和string有什么区别?

7511

这两者之间有什么不同,我应该使用哪一个?

string s = "Hello world!";
String s = "Hello world!";

110
@O.R.Mapper,事实仍然存在,string 是 C# 语法的一个 词法 构造,而 System.String 只是一种类型。无论任何规范中提到的 显式 差异如何,仍然存在这种隐含的差异,可能会带来一些歧义。语言本身必须以一种不需要考虑 BCL 中的特定类的方式支持 string - Kirk Woll
146
根据语言规范,该语言本身必须将“string”视为与BCL类型“System.String”完全相同,没有任何其他含义。这一点毫不含糊。当然,你可以使用C#语法实现自己的编译器,并使用找到的所有标记来执行任意的、与C#语言规范定义无关的操作。然而,结果得到的语言只能被视为类似于C#,而不能被视为C#本身。 - O. R. Mapper
125
对于System命名空间的string类型,您无需使用using指令即可直接使用,但是对于String类型则不行。 - Wilsu
27
对于来自Algol和Fortran的人来说,这个讨论表明string存在问题。需要缩写System.String,但作为别名,它看起来非常相似,但不完全相同。然而,经过几年的C#编程,我认为,安全起见,可以直接使用stringstring.Format(),不用担心System.String - Roland
27
@Sangeeta你在说什么?System.String类还在,而string关键字仍然是它的别名,就像System.Int32int一样。它们实际上是同一个东西。 - Craig Tullis
显示剩余11条评论
67个回答

12

说实话,在实践中,System.Stringstring通常没有区别。

C#中的所有类型都是对象,都派生自System.Object类。一个不同之处在于,string是C#的关键字,而String可以用作变量名。System.String是这种类型的传统.NET名称,而string是方便的C#名称。下面是一个简单的程序,演示了System.String和string之间的区别。

string a = new string(new char[] { 'x', 'y', 'z' });
string b = new String(new char[] { 'x', 'y', 'z' });
String c = new string(new char[] { 'x', 'y', 'z' });
String d = new String(new char[] { 'x', 'y', 'z' });
MessageBox.Show((a.GetType() == typeof(String) && a.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((b.GetType() == typeof(String) && b.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((c.GetType() == typeof(String) && c.GetType() == typeof(string)).ToString()); // shows true
MessageBox.Show((d.GetType() == typeof(String) && d.GetType() == typeof(string)).ToString()); // shows true

@JonSkeet在我的编译器中

public enum Foo : UInt32 { }

正在工作。我使用的是Visual Studio 2015社区版。


12
在VS2015中,如果你写下这句话:

string is equal to System.String

,那么"string"就等同于"System.String"。
System.String str;

编译器会显示可能的修复方法以进行优化,应用该修复方法后,它将如下所示

string str;

10

Jeffrey Richter写道:

另一种思考方式是,C#编译器会自动假定在您所有的源代码文件中都有以下using指令:

using int = System.Int32;
using uint = System.UInt32;
using string = System.String;
...

我见过许多开发人员感到困惑,不知道在他们的代码中使用string还是String。因为在C#中,string(一个关键字)与System.String(一个FCL类型)完全对应,没有区别,所以两者都可以使用。


9
字符串:一个字符串对象被称为不可变的(只读),因为它的值一旦创建就不能修改。似乎修改字符串对象的方法实际上返回一个包含修改内容的新字符串对象。如果需要修改类似于字符串的对象的实际内容,则必须使用可变类型,如StringBuilder类。 string:字符串类型表示零个或多个Unicode字符的序列。在.NET Framework中,string是String的别名。string是内置的C#数据类型,并且是系统提供的类型"System.String"的别名。C#规范指出,作为风格问题,关键字(string)比完整系统类型名称(System.String或String)更受欢迎。 虽然string是引用类型,但相等性运算符(==和!=)被定义为比较string对象的值,而不是引用。这使得测试字符串相等更加直观。例如: string和String之间的区别:
  • 通常使用string进行声明,而使用String访问静态字符串方法。
  • 可以使用'string'声明使用预定义类型'string'的字段���属性等,因为C#规范告诉我这是很好的风格。
  • 可以使用'String'来使用系统定义的方法,如String.Compare等。它们最初是在'System.String'上定义的,而不是在'string'上定义的。在这种情况下,'string'只是一个别名。
  • 当与其他系统通信时,尤其是如果它们符合CLR(公共语言运行时)标准,可以使用'String'或'System.Int32'。也就是说,如果我从其他地方获取数据,则会将其反序列化为System.Int32而不是'int',如果原始定义是C#系统之外的其他内容。

9

这两者没有区别,您可以在代码中使用任何一个。

System.String 是一个类(引用类型),定义在命名空间 System 中的 mscorlib 中。换句话说,System.StringCLR 中的一种类型。

stringC# 中的关键字。


8
MSDN文档的背景下,String类像其他数据类型一样记录在BCL中(例如XmlReaderStreamReader)。
string则像关键字(C#参考)或任何基本的C#语言结构(例如forwhiledefault)一样记录。 参考资料

8
正如指出的那样,它们是同一件事情,“string”只是“String”的别名。
就我个人而言,我使用“string”来声明类型-变量、属性、返回值和参数。这与其他系统类型的使用方式一致-例如“int,bool,var”等(虽然“Int32”和“Boolean”也是正确的)。
当使用String类上的静态方法时,例如String.Split()或String.IsNullOrEmpty(),我使用“String”。我认为这更有意义,因为这些方法属于一个类,并且与我使用其他静态方法的方式一致。

8
"string" 是 "System.String" 的简称。 "String" 或 "System.String" 是在 CTS(公共类型系统) 中表示字符串的名称。"

8
一段字符串是用于表示文本的一个连续的字符集合
一个String对象是由表示字符串的System.Char对象的连续集合组成;每个System.Char对象对应一个UTF-16代码单元。
String对象的值是System.Char对象的连续集合的内容,该值是不可变的(也就是说,只读的)。
有关字符串不可变性的更多信息,请参见msdn中的Immutability and the StringBuilder class部分。
在内存中,String对象的最大大小为2GB,或者大约10亿个字符。
注意:答案摘自msdn帮助部分。您可以在“备注”部分下查看此处在msdn字符串类主题的完整内容。

8
我更喜欢使用string,因为这种类型经常使用,我不想让语法高亮混在所有其他类中。虽然它是一个类,但它更像一个原始的类型,因此我认为不同的高亮颜色是合适的。
如果你右键单击string关键字,并从上下文菜单中选择转到定义,它会带你到String类——这只是一种语法糖,但它提高了可读性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接