2013-12-12 39 views
6

我知道這可能聽起來像一個奇怪的問題,但這一直持續了一段時間在我腦海中。C#中的System.String類型#

我知道C#中的System.String類型實際上是一個帶有一個具有字符數組參數的構造函數的類。例如下面的代碼是合法的,並不會造成錯誤:

System.String s = new System.String("Hello".toCharArray()); 

我的問題是,是什麼使是可能的System.String類接受字符數組簡單地這樣說:

System.String s = "Hello"; 
+3

編譯器團隊所做的可能。就像其他文字一樣,可擴展的方法等等。 –

+0

難道是因爲它使用的索引器嗎?如果是這樣,那麼它是如何做到的? – Transcendent

+0

這是一種語言結構,就像'if'語句或'var'關鍵字一樣。這只是語言的工作原理,'string'是一個特殊情況,可以讓你更容易使用。 –

回答

8

當你撥打:

System.String s = new System.String("Hello".toCharArray()); 

你被明確調用構造函數

當你寫:

string foo = "bar"; 

的IL指令(Ldstr)將一個新對象引用該字符串文字。這與調用構造函數不同。

+1

該死,塞維有神奇的力量 – Habib

3

這是可能的,因爲C# language指定字符串文字是可能的(請參閱§2.4.4.5字符串文字)。 C#編譯器和CIL/CLR對如何使用這些文字有很好的支持,例如與ldstr操作碼。

不支持將這些文字用於自定義類型。

-2

字符串是一種特殊的clr類型。它們是唯一不可變的參考類型。

這裏有幾件事情可以幫助你瞭解字符串類型:

var a = "Hello"; 
var b = new String("Hello".ToCharArray()); 
var c = String.Intern(b); // 'interns' the string... 
var equalsString = a == b; // true 
var equalsObj = (object)a == (object)b; // false 
var equalsInterned = (object)a == (object)c; // true !! 

a[0] = 't'; // not valid, because a string is immutable. Instead, do it this way: 
var array = b.ToArray(); 
array[0] = 't'; 
a = new String(array); // a is now "tello" 
+0

'他們是唯一不可變的參考類型。'什麼?真?對不起,不行。有*許多不變的參考類型。這裏還有一個:'public class Foo {}' – Servy

+0

@Servy這是設計的不變性......字符串是不可變的,因爲clr是這樣說的,而不是程序員。 – Olivier

+1

首先,沒有任何真正的區別。其次,字符串甚至不是不可變的,從技術上講,它們在公共API中是不可變的。內部字符串可以是,而且在某些情況下,實際上是實際上是變異的,所以顯然不變性不會由運行時強制執行;顯然它允許它。 – Servy

相關問題