Apa keputusan desain yang mendukung void
tidak dapat dibangun dan tidak diizinkan sebagai tipe generik? Bagaimanapun, ini hanyalah kekosongan khusus struct
dan akan menghindari total PITA untuk memiliki yang berbeda Func
dan Action
delegasi.
(C ++ memungkinkan void
pengembalian eksplisit dan memungkinkan void
sebagai parameter templat)
c#
.net
language-design
Thomas Owens
sumber
sumber
Jawaban:
Masalah mendasar dengan "void" adalah bahwa itu tidak berarti hal yang sama dengan tipe pengembalian lainnya. "void" berarti "jika metode ini kembali maka tidak ada nilai sama sekali." Bukan nol; null adalah sebuah nilai. Sama sekali tidak mengembalikan nilai.
Ini benar-benar mengacaukan sistem tipe. Sistem tipe pada dasarnya adalah sistem untuk membuat deduksi logis tentang operasi apa yang valid pada nilai-nilai tertentu; metode pengembalian batal tidak mengembalikan nilai, jadi pertanyaan "operasi apa yang valid untuk hal ini?" sama sekali tidak masuk akal. Tidak ada "hal" untuk dioperasi, valid atau tidak valid.
Selain itu, ini mengacaukan sesuatu runtime sengit. .NET runtime adalah implementasi dari Sistem Eksekusi Virtual, yang ditentukan sebagai mesin stack. Yaitu, mesin virtual di mana operasi semua ditandai dalam hal efeknya pada tumpukan evaluasi. (Tentu saja dalam praktiknya mesin akan diimplementasikan pada mesin dengan tumpukan dan register, tetapi sistem eksekusi virtual mengasumsikan hanya tumpukan.) Efek panggilan ke metode batal pada dasarnyaberbeda dari efek panggilan ke metode non-void; metode non-void selalu menempatkan sesuatu pada stack, yang mungkin perlu dihapus. Metode batal tidak pernah menempatkan sesuatu di tumpukan. Dan karenanya kompiler tidak dapat memperlakukan metode void dan non-void sama dalam kasus di mana nilai yang dikembalikan metode diabaikan; jika metode ini batal maka tidak ada nilai balik sehingga tidak boleh ada pop.
Untuk semua alasan ini, "void" bukan tipe yang bisa dipakai; tidak memiliki nilai , itulah intinya. Ini tidak dapat dikonversi ke objek, dan metode pengembalian batal tidak pernah dapat diperlakukan secara polimorfik dengan metode non-batal-kembali karena melakukan hal itu merusak tumpukan!
Dengan demikian, void tidak dapat digunakan sebagai argumen tipe, yang memalukan, seperti yang Anda catat. Akan sangat nyaman.
Dengan manfaat melihat ke belakang, akan lebih baik bagi semua pihak yang peduli jika alih-alih tidak melakukan apa pun, metode pengembalian yang kosong secara otomatis mengembalikan "Unit", tipe referensi tunggal ajaib. Anda kemudian akan tahu bahwa setiap pemanggilan metode meletakkan sesuatu di tumpukan , Anda akan tahu bahwa setiap pemanggilan metode mengembalikan sesuatu yang dapat ditugaskan ke variabel tipe objek , dan tentu saja Unit dapat digunakan sebagai argumen tipe , sehingga akan ada tidak perlu memiliki tipe delegasi Aksi dan Fungsi yang terpisah. Sayangnya, itu bukan dunia tempat kita berada.
Untuk beberapa pemikiran lain dalam nada ini, lihat:
sumber
Void
harus ok untuk diteruskan sebagai jumlah tak terbatas argumen di dalam 0 stack byte. Ketika struktur apa pun perlu dikonversikan keobject
atau memanggil metode (untuk mendapatkanthis
) itu kotak dengan menempatkan pada tumpukan denganType
referensi dimasukkan sebelum bidang bidang memori (untuk banyak implementasi CLR) dan dengan demikian dapat ditangani dengan benar. Adapun tipe saya hanyalah pengelompokan objek yang dapat dibedakan berdasarkan beberapa karakteristik (bidang).Void
hanyalah satu objek.void
adalah tipe nilai kosong, maka pernyataan itu akan diterjemahkan menjadi nol instruksi kode mesin. Tidak terlalu berguna untuk tipe hard-codedVoid
, tetapi berguna dalam kasus-kasus di mana tipe memiliki beberapa parameter umum tetapi beberapa tidak diperlukan dalam kasus-kasus tertentu.Dari: http://connect.microsoft.com/VisualStudio/feedback/details/94226/allow-void-to-be-parameter-of-generic-class-if-not-in-c-then-just-in- runtime
Saya tidak bisa seumur hidup saya melihat bagaimana kekosongan adalah lubang keamanan, tapi ... begitulah katanya.
sumber