string
vs. String
不是一场风格辩论
[...]
关键字string
在C#中具有具体含义。它是System.String
核心运行时程序集中存在的类型。运行时从本质上理解这种类型,并提供了开发人员期望的.NET字符串功能。它的存在对C#至关重要,如果不存在该类型,编译器将在尝试解析一行代码之前退出。因此string
在C#代码中具有精确,明确的含义。
标识符String
虽然在C#中没有具体含义。它是一个经过所有名称查找规则的标识符,例如Widget
,Student
等等。它可以绑定到字符串,也可以绑定到另一个程序集中的某个类型,其目的可能与完全不同string
。更糟糕的是,它的定义方式可能像这样的代码String s = "hello"
;继续编译。
class TricksterString {
void Example() {
String s = "Hello World"; // Okay but probably not what you expect.
}
}
class String {
public static implicit operator String(string s) => null;
}
的实际含义String
将始终取决于名称解析。这意味着它取决于项目中的所有源文件以及所有引用的程序集中定义的所有类型。简而言之,要了解它的含义需要相当多的上下文。
确实,在绝大多数情况下String
,string
它将绑定到相同类型。但是使用String
仍然意味着开发人员只能在只有一个正确答案的地方让程序自行解释。当String
确实绑定到错误的类型时,它可能会使开发人员进行数小时的调试,将错误提交给编译器团队,并且通常会浪费时间,而这可以通过使用节省string
。
可视化差异的另一种方法是使用以下示例:
string s1 = 42; // Errors 100% of the time
String s2 = 42; // Might error, might not, depends on the code
许多人会争辩说,尽管这是技术上准确的信息,但String
仍然可以使用,因为很少有代码库会定义此名称的类型。或者,当String
定义它时,就表明代码库不正确。
[...]
你会看到,String
被定义为一些完全有效的用途:反射帮手,系列化库,词法分析器,协议等...对于任何的这些库String
与string
具有真正的影响取决于在代码中使用。
因此,请记住,当您看到String
vs. string
辩论时,这是关于语义而不是样式的。选择字符串可使代码库具有清晰的含义。选择String
并没有错,但它为将来的惊喜打开了大门。
string
是C#语法的词汇构造,而仅仅是一种类型。不管任何规范中提到的任何显着差异,仍然存在这种隐含差异,可以通过一些歧义来解决。语言本身必须以某种方式支持该实现,而不是(非常)必须考虑BCL中的特定类。System.String
string