Alasan / masalah mendasar adalah bahwa perancang spesifikasi CLS (yang mendefinisikan bagaimana bahasa berinteraksi dengan .net) tidak mendefinisikan sarana yang oleh anggota kelas dapat menentukan bahwa mereka harus dipanggil secara langsung, bukan melaluicallvirt
, tanpa penelepon melakukan suatu cek referensi-nol; juga tidak memberikan banyak definisi struktur yang tidak akan dikenakan tinju "normal".
Jika spesifikasi CLS mendefinisikan cara seperti itu, maka akan mungkin bagi .net untuk secara konsisten mengikuti petunjuk yang ditetapkan oleh Common Object Model (COM), di mana referensi string nol dianggap secara semantik setara dengan string kosong, dan untuk lainnya tipe kelas yang tidak dapat diubah yang ditentukan pengguna yang seharusnya memiliki semantik nilai untuk juga mendefinisikan nilai default. Pada dasarnya, apa yang akan terjadi bagi masing-masing anggota String
, misalnya Length
ditulis sebagai sesuatu seperti [InvokableOnNull()] int String Length { get { if (this==null) return 0; else return _Length;} }
. Pendekatan ini akan menawarkan semantik yang sangat bagus untuk hal-hal yang harus berperilaku seperti nilai, tetapi karena masalah implementasi perlu disimpan di heap. Kesulitan terbesar dengan pendekatan ini adalah bahwa semantik konversi antara jenis danObject
bisa menjadi sedikit keruh.
Suatu pendekatan alternatif akan memungkinkan definisi tipe struktur khusus yang tidak diwarisi dari Object
tetapi memiliki operasi tinju kustom dan unboxing (yang akan dikonversi ke / dari beberapa jenis kelas lainnya). Di bawah pendekatan seperti itu, akan ada tipe kelas NullableString
yang berperilaku sebagai string tidak sekarang, dan tipe struct kotak-kustom String
, yang akan menampung bidang Value
tipe privat tunggal String
. Mencoba mengonversikan String
ke NullableString
atau Object
akan kembali Value
jika bukan nol, atau String.Empty
jika nol. Mencoba melakukan cast String
, referensi non-nol ke NullableString
instance akan menyimpan referensi di Value
(mungkin menyimpan null jika panjangnya nol); casting referensi lain akan menimbulkan pengecualian.
Meskipun string harus disimpan di heap, secara konseptual tidak ada alasan mengapa mereka tidak boleh berperilaku seperti tipe nilai yang memiliki nilai default non-nol. Memiliki mereka disimpan sebagai struktur "normal" yang memegang referensi akan lebih efisien untuk kode yang menggunakannya sebagai tipe "string", tetapi akan menambahkan lapisan tipuan dan inefisiensi tambahan saat casting ke "objek". Meskipun saya tidak melihat .net menambahkan salah satu dari fitur di atas pada akhir ini, mungkin desainer kerangka masa depan mungkin mempertimbangkan untuk memasukkannya.