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个回答

38

这两者之间没有区别 - 然而,在考虑其他开发者的源代码时,字符串似乎是更受欢迎的选择。


30

有一个在其他地方未提及的支持使用帕斯卡命名法 String 的理由:

System.String 是一种引用类型,按照惯例,引用类型的名称通常采用帕斯卡命名法


5
外壳约定在引用类型和值类型之间没有区别,正如您自己提到的Int32类型所证明的那样。摒弃关键字而选择类名来遵守某些想象中的规则,这个做法并没有意义,因为引用类型并没有遵循不同于值类型的命名约定。 - P Daddy

26

两者是一样的。不同之处在于你如何使用它。
约定俗成的是,

string 用于变量

String 用于调用其他 String 类的方法

例如:

string fName = "John";
string lName = "Smith";

string fullName = String.Concat(fName,lName);

if (String.IsNullOrEmpty(fName))
{
  Console.WriteLine("Enter first name");
}

3
这个约定已经失效了:如果你使用Visual Studio 2015并尝试使用String,程序会建议你"简化你的代码",将它转换为string - Massimiliano Kraus

24

stringString之间有一个实际的区别。

nameof(String); // compiles
nameof(string); // doesn't compile

这是因为string是一个关键字(在这种情况下是别名),而String是一种类型。
其他别名也是如此。
| Alias     | Type             |
|-----------|------------------|
|  bool     |  System.Boolean  |
|  byte     |  System.Byte     |
|  sbyte    |  System.SByte    |
|  char     |  System.Char     |
|  decimal  |  System.Decimal  |
|  double   |  System.Double   |
|  float    |  System.Single   |
|  int      |  System.Int32    |
|  uint     |  System.UInt32   |
|  long     |  System.Int64    |
|  ulong    |  System.UInt64   |
|  object   |  System.Object   |
|  short    |  System.Int16    |
|  ushort   |  System.UInt16   |
|  string   |  System.String   |

1
最终有人能够说明实际的区别...你还可以在使用String类型之前添加一个using System;指令,而不是使用C#关键字string。这应该是被选中的答案,或者至少是一个高票答案。 - mins

23

实际上没有什么区别。

C#关键字string映射到.NET类型System.String - 它是一个保持语言命名约定的别名。


17

如果真的想看到 stringSystem.String 之间没有区别,那么以下内容可能会有所帮助:

var method1 = typeof(MyClass).GetMethod("TestString1").GetMethodBody().GetILAsByteArray();
var method2 = typeof(MyClass).GetMethod("TestString2").GetMethodBody().GetILAsByteArray();

//...

public string TestString1()
{
    string str = "Hello World!";
    return str;
}

public string TestString2()
{
    String str = "Hello World!";
    return str;
}

两者生成的IL字节数组完全相同:

[ 0, 114, 107, 0, 0, 112, 10, 6, 11, 43, 0, 7, 42 ]

2
我已经给了你一个+1,但是当optimise+开启时,你的实际方法是完全相同的return "Hello World!";。为了确保类型被“考虑”,你可以使用return (string)(object)typeof(string).Name;return (System.String)(System.Object)typeof(System.String).Name;,这也证实了System.Objectobject是相同的 :-) - Mark Hurd

16

String指的是一个带有多种操作字符串的函数的字符串对象。

string指的是一种原始类型。

在C#中,它们都编译为String,但在其他语言中则不然,因此如果想要处理字符串对象,应使用String;如果想要处理字面值,则应使用string。


16

C#中,字符串是System.String (String)的简写。 它们基本上是指同一件事。

这就像boolBoolean,差别不大。


1
嗨@MichaelAdams,感谢您指出这一点。我的意思是stringSystem.String简写版本。 - Taslim Oseni

15

你不需要导入命名空间(使用System;)来使用string,因为它是System.String的全局别名。

要了解更多关于别名的信息,可以查看此链接


14

首先,stringString不同。它们的区别在于:String不是关键字,可以用作标识符;而string是关键字,不能用作标识符。

我将通过以下示例进行解释: 当我在Visual Studio中输入string s;并将鼠标悬停在上面时(不带颜色),会出现以下内容:
String Definition

这说明string是System.String,对吧? 文档位于https://msdn.microsoft.com/en-us/library/362314fe.aspx。第二句话说:“string是.NET Framework中String的别名。”


6
在内部它们是相同的。意思是,它们指向相同的事物,可以互换使用。它们的区别在于String是定义的实际结构体的名称,而string是指向该结构体的别名。string作为关键字是一个别名,这就是为什么VS显示它们为不同颜色。如果你右键点击查看string的定义,你将会看到String结构体。 - Heriberto Lugo

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