C#中的String与string:有什么区别以及如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

C#中的String和string:是同一个东西还是不同?带示例解析

\n\n

如果你曾经写过C#代码,你一定会注意到字符串可以用两种方式声明:

\n\n
string name = "安娜";\nString greeting = "你好!";
\n\n

两种方式都能正常工作。这就引出了一个合理的问题:C#中string和String有什么区别?它们是不同的类型吗?其中一个更快?还是仅仅是语言开发者的一个怪癖?

\n\n

剧透:没有区别。但事情并不像第一眼看上去那么简单。让我们真正深入了解一下,这样你不仅知道Stack Overflow上这个热门问题的答案,还能理解为什么要这样设计,以及哪种方式在实际项目中更好。

\n\n

简短回答:string是System.String的别名

\n\n

在C#中,关键字string仅仅是System.String类的别名(alias)。就像int是System.Int32的别名,bool是System.Boolean的别名一样。

\n\n

当编译器看到string时,它会自动替换为System.String。这意味着两种声明编译成相同的IL代码:

\n\n
// 这两行在IL层面完全一致\nstring a = "Hello";\nSystem.String b = "World";
\n\n

如果你通过ILSpy或dotPeek打开编译后的.dll或.exe文件,你会发现这两个声明之间没有任何区别。

\n\n

但为什么两种方式都存在?

\n\n

从历史上看,C#继承了C/C++的语法,其中string不是关键字,而是一个类。.NET开发者决定添加方便的别名,使代码看起来更自然,让来自其他语言的程序员感到熟悉。

\n\n

此外,别名不需要引入命名空间。要使用String,你需要添加using System;,或者写完整的名称System.String。而string则没有这个问题——它始终可用。

\n\n

什么时候用string,什么时候用String?

\n\n

大多数团队遵循的黄金法则,也是微软在C#文档中推荐的:

\n\n
    \n
  • 使用string来声明变量、方法参数、返回值——任何它作为类型关键字的地方。
  • \n
  • 仅使用String来调用类的静态方法(例如String.IsNullOrEmpty()),或者在需要显式指定命名空间的极少数情况下使用System.String。
  • \n
\n\n

为什么这样?因为string是语言关键字,在IDE中会高亮显示,一眼就能看出是字符串。而String只是一个类名,更容易与其他类混淆。

\n\n

良好风格的示例

\n\n
// 变量声明(使用string)\nstring userName = "伊万";\n\n// 调用静态方法(使用String)\nif (String.IsNullOrEmpty(userName))\n{\n    Console.WriteLine("姓名不能为空");\n}\n\n// 方法参数(使用string)\npublic void Greet(string name)\n{\n    Console.WriteLine($"你好,{name}!");\n}
\n\n

性能上有区别吗?

\n\n

许多开发者会问:是不是string比String更快?或者反过来?

\n\n

答案:性能上没有区别。完全没有。编译后,两种方式都会变成相同的IL代码。时间上没

博客

书籍推荐