Temel neden / sorun, CLS spesifikasyonunun tasarımcılarının (dillerin .net ile nasıl etkileşime girdiğini tanımlayan) sınıf üyelerinin callvirt
, arayan bir null-referans kontrolü; ne de "normal" bokslamaya tabi olmayacak yapıların tanımlanması için bir ortalama sağlamadı.
CLS spesifikasyonu böyle bir araç tanımlamış olsaydı, o zaman .net'in Ortak Nesne Modeli (COM) tarafından kurulan ve altında boş bir dize başvurusunun semantik olarak boş bir dizeye eşdeğer olduğu kabul edilen lead'i tutarlı bir şekilde izlemesi mümkün olurdu. varsayılan değerleri tanımlamak için değer semantiğine sahip olması gereken kullanıcı tanımlı değişmez sınıf türleri. Esasen, her bir üye için ne olacağını String
, örneğin bir Length
şey gibi yazılacaktı [InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }
. Bu yaklaşım, değer gibi davranması gereken şeyler için çok güzel bir anlambilim sunacaktır, ancak uygulama sorunlarının yığın üzerinde depolanması gerekir. Bu yaklaşımla ilgili en büyük zorluk, bu türler arasındaki dönüşüm semantiğinin ve Object
biraz bulanık olabilmesidir.
Alternatif bir yaklaşım, miras almayan, Object
bunun yerine özel boks ve kutudan çıkarma operasyonlarına sahip olan (diğer bazı sınıf tiplerine dönüşebilen) özel yapı tiplerinin tanımlanmasına izin vermek olurdu. Böyle bir yaklaşıma göre, bir sınıf tipi olacağını NullableString
dize şimdi yaptığı gibi davranır ve özel kutulu yapı tipi String
tek özel alan yapacağını, Value
Çeşidi String
. Bir dönüştürmek için çalışılıyor String
etmek NullableString
veya Object
dönecekti Value
olmayan boş ise, ya String.Empty
boş eğer. Yayınlamaya çalışıldığında String
, bir NullableString
örneğe null olmayan bir başvuru başvuruyu depolar Value
(belki de uzunluk sıfırsa null değerini saklar); başka bir atıfta bulunmak istisna oluşturur.
Dizelerin yığın üzerinde depolanması gerekmesine rağmen, kavramsal olarak null olmayan varsayılan değere sahip değer türleri gibi davranmamaları için hiçbir neden yoktur . Bir referansı tutan "normal" bir yapı olarak saklanmaları, bunları "dize" türü olarak kullanan kod için etkili olurdu, ancak "nesneye" döküm yaparken fazladan bir dolaylama ve verimsizlik katmanı ekleyecektir. .Net bu geç tarihte yukarıdaki özelliklerden birini eklemeyi öngörmese de, belki de gelecekteki çerçevelerin tasarımcıları bunları dahil etmeyi düşünebilir.