今天忽然看到一篇文章關於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區分的一個小總結,若是有遺漏或不正確的地方,歡迎指正。