Dalam C #, katakanlah Anda ingin menarik nilai dari PropertyC dalam contoh ini dan ObjectA, PropertyA dan PropertyB semuanya bisa menjadi null.
ObjectA.PropertyA.PropertyB.PropertyC
Bagaimana saya bisa mendapatkan PropertyC dengan aman dengan jumlah kode yang paling sedikit?
Sekarang saya akan memeriksa:
if(ObjectA != null && ObjectA.PropertyA !=null && ObjectA.PropertyA.PropertyB != null)
{
// safely pull off the value
int value = objectA.PropertyA.PropertyB.PropertyC;
}
Akan menyenangkan untuk melakukan sesuatu yang lebih seperti ini (pseudo-code).
int value = ObjectA.PropertyA.PropertyB ? ObjectA.PropertyA.PropertyB : defaultVal;
Mungkin lebih jauh lagi runtuh dengan operator penggabungan nol.
EDIT Awalnya saya mengatakan contoh kedua saya seperti js, tetapi saya mengubahnya menjadi psuedo-code karena itu dengan benar menunjukkan bahwa itu tidak akan berfungsi di js.
ObjectA
atauPropertyA
nol.Jawaban:
Dalam C # 6 Anda dapat menggunakan Operator Bersyarat Null . Jadi tes aslinya adalah:
sumber
value
sama dengan jikaPropertyC
nol? atau jikaPropertyB
nol? bagaimana jikaObject A
nol?null
. Dimulai dari kiri ke kanan. Tanpa gula sintaksis ini setara dengan serangkaian pernyataan if di manaif(propertyX == null) {value = null} else if (propertyY == null){ value = null} else if......
dengan ekspresi terakhir akhirnya menjadiif(propertyZ != null) { value = propertyZ }
Metode Perpanjangan Pendek:
Menggunakan
Metode ekstensi sederhana ini dan banyak lagi yang dapat Anda temukan di http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/
EDIT:
Setelah menggunakannya sebentar saya pikir nama yang tepat untuk metode ini harus IfNotNull () bukan asli With ().
sumber
Bisakah Anda menambahkan metode ke kelas Anda? Jika tidak, apakah Anda pernah berpikir untuk menggunakan metode ekstensi? Anda dapat membuat metode ekstensi untuk tipe objek Anda yang disebut
GetPropC()
.Contoh:
Pemakaian:
Omong-omong, ini mengasumsikan Anda menggunakan .NET 3 atau lebih tinggi.
sumber
Cara Anda melakukannya benar.
Anda bisa menggunakan trik seperti yang dijelaskan di sini , menggunakan ekspresi Linq:
Tetapi jauh lebih lambat daripada memeriksa setiap properti secara manual ...
sumber
Refactor untuk mematuhi Hukum Demeter
sumber
Pembaruan 2014: C # 6 memiliki
?.
berbagai operator baru yang disebut 'navigasi aman' atau 'penyebaran nol'Baca http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx untuk detailnya
Ini telah lama menjadi permintaan yang sangat populer https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c-?tracking_code=594c10a522f8e9bc987ee4a5e2c0b38d
sumber
Anda jelas mencari Nullable Monad :
menjadi
Ini mengembalikan
null
, jika salah satu properti nullable adalah null; jika tidak, nilaiValue
.Metode ekstensi LINQ:
sumber
SelectMany
metode ekstensi digunakan olehfrom ... in ... from ... in ...
sintaks.Dengan asumsi Anda memiliki nilai kosong dari tipe satu pendekatan akan menjadi ini:
Saya penggemar berat C # tapi hal yang sangat bagus di Java baru (1.7?) Adalah.? operator:
sumber
Kode ini adalah "jumlah kode paling sedikit", tetapi bukan praktik terbaik:
sumber
Ketika saya perlu melakukan panggilan berantai seperti itu, saya mengandalkan metode helper yang saya buat, TryGet ():
Dalam kasus Anda, Anda akan menggunakannya seperti ini:
sumber
Saya melihat sesuatu di C # 6.0 baru, ini dengan menggunakan '?' alih-alih memeriksa
misalnya daripada menggunakan
Anda cukup menggunakan
Saya harap ini membantu seseorang.
MEMPERBARUI:
Anda bisa melakukan seperti ini sekarang
sumber
Anda bisa melakukan ini:
Atau lebih baik lagi:
sumber
Anda dapat menggunakan ekstensi berikut dan menurut saya ini sangat bagus:
Dan digunakan seperti ini:
sumber
Saya akan menulis metode Anda sendiri dalam tipe PropertyA (atau metode ekstensi jika bukan tipe Anda) menggunakan pola yang mirip dengan tipe Nullable.
sumber
Baru saja menemukan postingan ini.
Beberapa waktu lalu saya memberikan saran tentang Visual Studio Connect tentang menambahkan file
???
operator .http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4104392-add-as-an-recursive-null-reference-check-opera
Ini akan membutuhkan beberapa pekerjaan dari tim kerangka kerja tetapi tidak perlu mengubah bahasanya tetapi cukup lakukan beberapa keajaiban kompiler. Idenya adalah bahwa kompilator harus mengubah kode ini (sintaks tidak diperbolehkan atm)
ke dalam kode ini
Untuk pemeriksaan null, ini akan terlihat seperti
sumber
Saya menulis metode yang menerima nilai default, berikut cara menggunakannya:
Ini kodenya:
sumber
Ini tidak mungkin.
ObjectA.PropertyA.PropertyB
akan gagal jikaObjectA
nol karena dereferensi nol, yang merupakan kesalahan.if(ObjectA != null && ObjectA.PropertyA
... bekerja karena korsleting, yaituObjectA.PropertyA
tidak akan pernah diperiksa jikaObjectA
adanull
.Cara pertama Anda mengusulkan adalah yang terbaik dan paling jelas dengan niat. Jika ada, Anda dapat mencoba mendesain ulang tanpa harus bergantung pada begitu banyak null.
sumber
Pendekatan ini cukup lurus ke depan setelah Anda mengatasi lambda gobbly-gook:
Dengan penggunaan yang mungkin terlihat seperti:
sumber
The
??
(null-coalescing operator) berarti jika argumen pertama adalahnull
, kembalikan yang kedua sebagai gantinya.sumber