Referans türleri ve değer türleri arasındaki ayrım, temel olarak dilin tasarımında bir performans dengesidir. Referans türlerinin, yığın üzerinde oluşturuldukları için inşaat ve imha ve çöp toplama üzerinde bazı ek yükleri vardır. Öte yandan değer türleri, yöntem çağrılarında (veri boyutu bir işaretçiden büyükse) ek yüke sahiptir, çünkü tüm nesne yalnızca bir işaretçi yerine kopyalanır. Dizeler bir işaretçinin boyutundan çok daha büyük (ve tipik olarak) olduğundan, başvuru türleri olarak tasarlanmıştır. Ayrıca, Servy'nin işaret ettiği gibi, bir değer türünün boyutu derleme zamanında bilinmelidir, bu da dizeler için her zaman geçerli değildir.
Değişebilirlik sorunu ayrı bir konudur. Hem referans tipleri hem de değer tipleri değişebilir ya da değişmez olabilir. Değişken değer türleri için semantikler kafa karıştırıcı olabileceğinden değer türleri tipik olarak değişmezdir.
Referans tipleri genellikle değişkendir, ancak mantıklıysa değişmez olarak tasarlanabilir. Dizeler değişmez olarak tanımlanır, çünkü belirli optimizasyonları mümkün kılar. Örneğin, aynı dize değişmez değeri aynı programda (bu oldukça yaygın olan) birden çok kez oluşursa, derleyici aynı nesneyi yeniden kullanabilir.
Öyleyse neden dizeleri metne göre karşılaştırmak için "==" aşırı yüklenmiş? Çünkü en kullanışlı anlambilimdir. İki dize metne eşitse, optimizasyonlar nedeniyle aynı nesne başvurusu olabilir veya olmayabilir. Bu yüzden referansları karşılaştırmak oldukça işe yaramazken, metni karşılaştırmak neredeyse her zaman istediğiniz şeydir.
Daha genel olarak konuşmak gerekirse, Dizeler değer semantiği olarak adlandırılır . Bu, C #'a özgü bir uygulama ayrıntısı olan değer türlerinden daha genel bir kavramdır. Değer türlerinde değer semantiği vardır, ancak başvuru türlerinde değer semantiği de olabilir. Bir tür değer semantiğine sahip olduğunda, temeldeki uygulamanın bir referans türü mü yoksa değer türü mü olduğunu gerçekten anlayamazsınız, bu nedenle bir uygulama ayrıntısını düşünebilirsiniz.
is
testleri bir kenara bıraktığından ), cevap muhtemelen "tarihsel nedenlerle" dir. Değişmeyen nesneleri fiziksel olarak kopyalamaya gerek olmadığından, kopyalama performansı bunun nedeni olamaz. Artık gerçekteis
kontrolleri (veya benzer kısıtlamaları) kullanan kodu kırmadan değiştirmek mümkün değildir .