今天忽然看到一篇文章关于string和String的,注意一个是string,另外一个是String。感受这个小细节仍是很重要的,因此就转了来。html
众所周知string是C#中System.String的别名,通常状况下两者具备相同的含义和功能,那问题时两者是彻底相同没有任何区别的吗?若是答案是“是”的话,微软为何实现了这两个概念而不是仅仅用sting或者String呢,毕竟用一个的话跟简单,给开发人员带来的困惑也更少。编程
这个问题纯粹是概念上和理解上的问题,对您的编程技巧没有实质的帮助,若是没有兴趣的话你看到这里就能够为止了;若是您是技术大牛,彻底明白这两者的含义,您能够忽略本文也能够帮我指正错误。post
好了,既然您继续向下看,那我也就继续说了哦J.ui
为了使本文描述更准确,特意百度一下,下面的分析中不少是参考了搜索结果的内容,甚至是照搬了部分代码,固然我也会在相应的位置上注明引用的URL地址。url
不废话了,直接上代码开始分析(请注意下面代码的颜色,这是我用插入代码的方式自动生成的)。spa
string s = “Hello, World.”; 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。code
相似的C#别名还有:orm
C#别名htm |
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全名:
public enum Foo:Int32{} //编译错误 public enum Bar:int{} //编译正确
还有一种状况:string是C#保留的关键字,而String是类名(不是保留关键字),也就是说若是你把String用做变量名是不会有编译错误的,而用string做变量名就会有编译错误。
StringBuilder String = new StringBuilder(); //编译正确 StringBuilder string = new StringBuilder();//编译错误
固然了,若是你非要用string做变量名的话请在string前加上@,即StringBuilder @string = new StringBuilder()这句话是编译能经过的。
还有一种状况:在反射中你只能使用String而不能使用string。
还有一种状况:在未使用using System状况下,你不能使用String而只能使用string。
最后一种状况:string是C#的保留字,而String是CLR的类型,若是其余厂商实现一种运行时来支持C#的话(刚好有没有支持String),结果就可想而知了。固然了这种状况基本上是不存在的,比彗星撞地球都概率小。
以上是对string和String区分的一个小总结,若是有遗漏或不正确的地方,欢迎指正。