C#中string 和String

今天忽然看到一篇文章關於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而不是Stringcode

      相似的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區分的一個小總結,若是有遺漏或不正確的地方,歡迎指正。

 

轉自在C#中string 和String到底有沒有區別?

相關文章
相關標籤/搜索