在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)來判斷;從技術上來講二者沒有什么區別,正如intInt32一樣。很多編程指導原則中推薦這樣的一種使用方法:當你使用對象時用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區分的一個小總結,如果有遺漏或不正確的地方,歡迎指正。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM