在C#中string 和String到底有没有区别?

今天上班的时候看到了几行C#代码,其中一行用的是string,另一个用的是String;大家都知道string是C#中System.String的别名,一般情况下二者具有相同的含义和功能,那问题时二者是完全相同没有任何区别的吗?如果答案是“是”的话,微软为什么实现了这两个概念而不是仅仅用sting或者String呢,毕竟用一个的话跟简单,给开发人员带来的困惑也更少。

这个问题纯粹是概念上和理解上的问题,对您的编程技巧没有实质的帮助,如果没有兴趣的话你看到这里就可以为止了;如果您是技术大牛,完全明白这二者的含义,您可以忽略本文也可以帮我指正错误。

好了,既然您继续向下看,那我也就继续说了哦J.

为了使本文描述更准确(其实是担心自己理解不全面,误导了继续看的dev们),我特地google了一下,下面的分析中很多是参考了搜索结果的内容,甚至是照搬了部分代码,当然我也会在相应的位置上注明引用的URL地址。

不废话了,直接上代码开始分析(请注意下面代码的颜色,这是我用插入代码的方式自动生成的)。

1 string s = “Hello, World.”;
2 String S = “Hello, World.”;

在含义上相当于是using string = System.String,你可以使用typeof(string) == typeof(System.String)来判断;从技术上来讲二者没有什么区别,正如int和Int32一样。很多编程指导原则中推荐这样的一种使用方法:当你使用对象时用string,当作类时用String,例如string s = String.Format(“Hello, {0}.”, “World”),这是微软在示例String.Format方法时的用法;而StyleCop现在强制使用C#规范的别名,也就是说使用StyleCop的话它会强制你使用string而不是String。

类似的C#别名还有:

C#别名

BCL全称

object

System.Object

string

System.String

bool

System.Boolean

byte

System.Byte

sbyte

System.SByte

short

System.Int16

ushort

System.UInt16

int

System.Int32

uint

System.UInt32

long

System.Int64

ulong

System.UInt64

float

System.Single

double

System.Double

decimal

System.Decimal

char

System.Char

和string、object不同,其他的别名都是值类型的,其中decimal是值类型但不是CLR的基础类型(primitive type)。CLR中唯一没有别名的基础类型是System.IntPtr。

有一种情况是必须使用别名而不能使用CLR全名:

1 public enum Foo:Int32{} //编译错误
2 
3 public enum Bar:int{} //编译正确

还有一种情况:string是C#保留的关键字,而String是类名(不是保留关键字),也就是说如果你把String用作变量名是不会有编译错误的,而用string作变量名就会有编译错误。

1 StringBuilder String = new StringBuilder(); //编译正确
2 
3 StringBuilder string = new StringBuilder();//编译错误

当然了,如果你非要用string作变量名的话请在string前加上@,即StringBuilder @string = new StringBuilder()这句话是编译能通过的。

还有一种情况:在反射中你只能使用String而不能使用string。

还有一种情况:在未使用using System情况下,你不能使用String而只能使用string。

最后一种情况:string是C#的保留字,而String是CLR的类型,如果其他厂商实现一种运行时来支持C#的话(恰好有没有支持String),结果就可想而知了。当然了这种情况基本上是不存在的,比彗星撞地球都几率小。

以上是对string和String区分的一个小总结,如果有遗漏或不正确的地方,欢迎指正。