今天突然看到一篇文章关于string和String的,注意一个是string,另一个是String。感觉这个小细节还是很重要的,所以就转了来。
众所周知string是C#中System.String的别名,一般情况下二者具有相同的含义和功能,那问题时二者是完全相同没有任何区别的吗?如果答案是“是”的话,微软为什么实现了这两个概念而不是仅仅用sting或者String呢,毕竟用一个的话跟简单,给开发人员带来的困惑也更少。
这个问题纯粹是概念上和理解上的问题,对您的编程技巧没有实质的帮助,如果没有兴趣的话你看到这里就可以为止了;如果您是技术大牛,完全明白这二者的含义,您可以忽略本文也可以帮我指正错误。
好了,既然您继续向下看,那我也就继续说了哦J.
为了使本文描述更准确,特地百度一下,下面的分析中很多是参考了搜索结果的内容,甚至是照搬了部分代码,当然我也会在相应的位置上注明引用的URL地址。
不废话了,直接上代码开始分析(请注意下面代码的颜色,这是我用插入代码的方式自动生成的)。
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。
类似的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全名:
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区分的一个小总结,如果有遗漏或不正确的地方,欢迎指正。