Sementara aku mempelajari delegasi yang merupakan sebenarnya merupakan kelas abstrak dalam Delegate.cs
, saya melihat metode berikut di mana saya tidak mengerti
- Mengapa nilai pengembalian menggunakan
?
meskipun itu sudah tipe referensi ( kelas ) ?[]?
artinya pada parameter
Bisakah Anda jelaskan?
public static Delegate? Combine(params Delegate?[]? delegates)
{
if (delegates == null || delegates.Length == 0)
return null;
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
c#
.net
null-coalescing-operator
nullable-reference-types
null-coalescing
snr - Pasang kembali Monica
sumber
sumber
Jawaban:
Penjelasan langkah demi langkah:
params Delegate?[] delegates
- Ini adalah array yang dapat dibatalkanDelegate
params Delegate?[]? delegates
- Seluruh array dapat dibatalkanKarena setiap parameter adalah tipe
Delegate?
dan Anda mengembalikan indeksDelegate?[]?
array, maka masuk akal bahwa tipe kembali adalahDelegate?
kompiler yang akan mengembalikan kesalahan seolah-olah Anda sedang returing danint
dari metode yang mengembalikan string.Anda dapat mengubah, misalnya, kode Anda untuk mengembalikan
Delegate
tipe seperti ini:sumber
?
meskipun itu sudah referensi (kelas) tipe?
untuk alasan yang persis sama mengapa nilai argumen menggunakan?
. Jika Anda memahami yang terakhir, Anda secara otomatis memahami yang pertama. Karena metode ini dapat mengembalikan nol , seperti parameter dapat menerima nol . Artinya, keduanya mungkin mengandung null .Since each parameter is of the type Delegate? and you return an index of the Delegate?[]? array, then it makes sense that the return type is Delegate?
Foo?
memilikiHasValue
properti yang rapi , sedangkanFoo
perlu== null
diperiksa (4) Mengkomunikasikan kepada pengembang yang membaca metode tanda tangan bahwa null adalah suatu kemungkinan, yang diharapkan, dan hasil yang benar. (5) Kode tersebut kelihatannya ditulis oleh seseorang yang sangat menyukai nullability dan bersikap eksplisit tentang hal ituJenis Referensi Nullable baru di C # 8.0, mereka tidak ada sebelumnya.
Ini masalah dokumentasi, dan bagaimana peringatan pada waktu kompilasi dihasilkan.
Pengecualian "objek tidak diatur ke turunan objek" adalah pengecualian umum. Tapi ini adalah pengecualian runtime, itu sebagian dapat ditemukan pada waktu kompilasi.
Untuk pelanggan tetap,
Delegate d
Anda selalu dapat meneleponartinya, Anda dapat kode itu, pada waktu kompilasi tidak ada yang akan terjadi. Itu dapat menimbulkan pengecualian saat runtime.
Sedangkan untuk yang baru
Delegate? p
Kode iniakan menghasilkan peringatan kompiler.
CS8602: Dereference of a possibly null reference
kecuali jika Anda menulis:apa artinya, panggil saja jika tidak nol.
Jadi, Anda mendokumentasikan variabel mungkin berisi null atau tidak. Ini memunculkan peringatan sebelumnya dan dapat menghindari beberapa tes untuk null. Apa yang Anda miliki untuk int dan int? Anda tahu pasti, satu bukan nol - dan Anda tahu cara mengonversi satu ke yang lain.
sumber
Delegate
bukan nol. Anda hanya berpura-pura yakin (yang cukup baik dalam kebanyakan kasus).int
, tidak akan pernah menjadi nol. Jika Anda memilikiDelegate
itu bisa nol (karena berbagai alasan, misalnya refleksi). Biasanya aman untuk mengasumsikan bahwaDelegate
(dalam C # 8 dengan NRT diaktifkan) bukan nol, tetapi Anda tidak pernah tahu pasti (di mana untukint
kami tahu pasti).Dalam C # 8 seseorang harus secara eksplisit menandai jenis referensi sebagai nullable.
Secara default, tipe-tipe itu tidak dapat mengandung null, agak mirip dengan tipe nilai. Meskipun ini tidak mengubah cara kerja di bawah tenda, pemeriksa tipe akan meminta Anda untuk melakukan ini secara manual.
Kode yang diberikan dihidupkan kembali untuk bekerja dengan C # 8, tetapi tidak mendapat manfaat dari fitur baru ini.
Berikut adalah contoh kode yang diperbarui (tidak berfungsi, hanya gagasan) yang memanfaatkan fitur ini. Ini menyelamatkan kami dari pemeriksaan nol dan sedikit menyederhanakan metode ini.
sumber
those types are not able to contain null
, perhatikan bahwa itu menghasilkan peringatan kompiler , bukan kesalahan. Kode akan berjalan dengan baik (meskipun mungkin menghasilkan NullReferenceExceptions). Ini dilakukan dengan mengingat kompatibilitas ke belakang.