2013-12-12 25 views
6

Bunun garip bir soru gibi gelebileceğini biliyorum ama bu bir süredir aklımda.System.String C yazın. C#

C# içindeki System.String türünün aslında bir karakter dizisi parametresine sahip bir kurucuya sahip bir sınıf olduğunu biliyorum. Örneğin aşağıdaki kod yasal ve hiçbir hata neden olur:

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

Sorum System.string sınıfı karakterlerin bir dizi kabul etmek için kılan mümkün olmasıdır basitçe bu şekilde:

System.String s = "Hello"; 
+3

derleyici ekibi mümkün kılan:

Burada dize türü anlamaya yardımcı olabilecek birkaç şey vardır. Diğer hazırlıklar gibi, 'Nullable ', uzantı yöntemleri, vb. –

+0

Kullanacağı dizinleyici nedeniyle olabilir mi? ve eğer öyleyse nasıl yapar? – Transcendent

+0

Tıpkı bir “if” ifadesi veya “var” anahtar kelimesi gibi bir dil yapısıdır. Dilin işleyişi basittir, 'string' kolay kullanım için izin veren özel bir durumdur. –

cevap

8

Aradığınızda: Açıkça bir kurucu

çağırıyoruz

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

Eğer yazarken:

string foo = "bar"; 

Bir IL talimatı (Ldstr) o dizeye yeni nesne başvurusu iter değişmezi. Bir kurucu çağırmakla aynı şey değil.

+1

Damn, Servy'nin sihirli güçleri var – Habib

3

Bu mümkündür, çünkü C# language, dizgi değişmezlerinin mümkün olduğunu belirtir (bkz. §2.4.4.5 Dize değişmezleri). C# derleyicisi ve CIL/CLR, bu editörlerin nasıl kullanıldığına, örneğin; ldstr opcode ile.

Kendi özel türleriniz için bu tür sözcükleri dahil etme konusunda destek yoktur.

-2

Dizeler, özel bir clr türüdür. Tek değişmez referans tipi bunlar.

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

'Tek değişmez referans türü bunlar. 'Ne? Gerçekten mi? Üzgünüm ama hayır. Değişken olmayan referans türleri * vardır. İşte bir tane daha: 'public public Foo {}' – Servy

+0

@Servy Tasarımla değişmezlik ... dizeler imkansızdır, çünkü clr programcı değil, öyle demiştir. – Olivier

+1

İlk önce, gerçek bir fark yok. İkincisi, dizeler teknik olarak değişmez, hatta değişmez, sadece kendi API'larında değişmezler. Dahili diziler olabilir ve bazı durumlarda aslında gerçekten mutasyona uğrarlar, bu nedenle açıkça değişmezlik çalışma zamanı tarafından zorlanmaz; açıkça izin veriyor. – Servy