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

4

许多人(例如Jeffrey Richter在他的书CLR Via C#中)声称System.Stringstring以及System.Int32int之间没有区别,但是我们必须更深入地加以区分,以便真正挤出这个问题的精华,使我们能够从中获得所有的营养价值(编写更好的代码)。

A. 对于编译器而言,它们是相同的...

  1. 对于开发人员来说也是如此。(我们了解#1并最终实现了自动驾驶。)

B. 但是,在框架和非C#上下文中,它们是不同的。不同之处包括...

  1. 对于其他不是C#的语言来说
  2. 在经过优化的CIL(曾经的MSIL)上下文中(.NET VM汇编语言)
  3. 在面向平台的上下文中--.NET Framework或Mono或任何CIL类型的领域
  4. 在针对多种.NET语言(如VB.NET、F#等)的书籍中
因为C#必须与其他语言共同占有.NET空间,所以这个问题才存在。
C. 总结一下...
在面向仅使用C#的受众群体(问问自己,谁会阅读这段代码或使用这个库)时,你应该使用stringint和其他C#类型。对于内部公司,如果只使用C#,那么就坚持使用C#类型。
而在面向多语言或框架受众群体时(当C#不是唯一的受众群体时),你应该使用System.StringSystem.Int32。对于你的内部组织,如果还使用VB.NET、F#或任何其他.NET语言,或者开发供客户使用的库,那么在这些情况下,你应该使用“Frameworky”类型,以便每个人都能理解你的接口,无论他们来自哪个宇宙。(反正克林贡语里怎么说System.String呢?)
希望对你有所帮助。

4

stringString在C#中没有太大区别。

String是.NET框架中System命名空间中的一个类。其完全限定名为System.String。小写的string是System.String的别名。

但是建议在声明变量时使用string

string str = "Hello";

在使用任何与字符串相关的内置方法时,我们可以使用 String,例如 String.IsNullOrEmpty()

另一个不同之处是,在使用 String 之前,我们必须在 .cs 文件中导入系统命名空间,而 string 可以直接使用。


2
在C#中,string是.NET框架中String类的别名。实际上,每种C#类型都有一个在.NET中对应的等效类型。
另一个小区别是,如果你使用String类,你需要导入System命名空间,而当你使用string关键字时,你不需要导入命名空间。

0
在C#中,Stringstring都用于表示一串字符,但它们在不同的上下文中使用:
1. string(小写s): - 这是C#中的一个关键字。 - 它是.NET System.String类的别名。 - 您可以在C#代码的任何地方使用它。
2. String(大写S): - 这表示.NET Framework中的System.String类。 - 要在不加限定符的情况下使用String(大写S),通常需要在代码文件的顶部添加using System;指令;否则,您需要使用System.String
下面是一个快速比较:
  • 初始化:

    string s1 = "你好";
    System.String s2 = "世界";
    
  • 方法使用:

    string s1 = "你好";
    int length = s1.Length; // 使用 string 关键字
    
    String s2 = "世界";
    int length2 = s2.Length; // 使用 String 类
    
实际区别:
从功能上来说,它们之间没有区别。在底层,它们都代表了.NET中的同一个System.String类。
使用哪个更多是个人偏好的问题,尽管由于其更简洁的特性,小写的string在变量声明中更常用,而大写的String通常出现在静态方法调用中,比如String.IsNullOrEmpty(...),不过看到string.IsNullOrEmpty(...)也并不少见。
C#语言对于其他类型也有类似的关键字到类的映射,比如int (System.Int32),float (System.Single),和bool (System.Boolean)。

-2
在C#中,string和String之间的微小差别。string只是system.String的别名。string和String都以相同的方式编译。答案很简单。string是关键字,提供有限的功能,主要用于创建变量,例如(string name = "Abrar")。或者我们可以说它是一种数据类型,我们专门用于字母表。而String是一个类,提供了丰富的函数和属性来操作字符串。希望您能轻松理解。

-5

至少有四个区别:

1- string是一个保留字,但是String只是一个类名。这意味着不能仅使用string作为变量名。

2- 你不能在不“using System”的情况下使用String,因此使用“string”可以减少写入的代码量。

3- 'String'是比'string'更好的命名约定,因为它是一种类型而不是变量。

4- "string"是C#关键字,并在大多数编码编辑器中语法突出显示,但不是"String"。


1
里面有一个观点 ;) 此外,大多数(如果不是全部)带有语法高亮的编辑器也会突出显示对象。 - SimonC

-9
一个好的思考方式是,字符串是一种数据类型,而String是一种类类型。它们各自有不同的方法,使用哪种取决于您的需求。

1
不,C# 中并不是这样的。根据规范定义,它们实际上是相同的东西。请参阅文档 - SimonC

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