Ketika Anda membuat metode ekstensi, tentu saja Anda bisa memanggilnya dengan null
, tetapi tidak seperti pemanggilan metode instance, memanggilnya dengan null tidak perlu melempar NullReferenceException
- > Anda harus memeriksa dan melemparnya secara manual.
Untuk implementasi metode ekstensi Linq Any()
, Microsoft memutuskan bahwa mereka harus melempar ArgumentNullException
(https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/AnyAll.cs).
Sangat menjengkelkan bagi saya untuk menulis if( myCollection != null && myCollection.Any() )
Apakah saya salah, sebagai klien dari kode ini, mengharapkan bahwa misalnya ((int[])null).Any()
seharusnya mengembalikan false
?
Saya memiliki sebuah kantong dengan lima kentang di dalamnya. Apakah ada kentang di dalam kantong?
"Ya," katamu. "<= true
Saya mengeluarkan semua kentang dan memakannya. Apakah ada kentang di dalam kantong?
"Tidak ada", katamu. "<= false
Saya benar-benar membakar kantong itu dalam api. Apakah ada kentang di dalam kantong sekarang?
"Tidak ada kantong." <= ArgumentNullException
Pertama, tampak bahwa kode sumber tersebut akan melemparkan ArgumentNullException
, bukan NullReferenceException
.
Meskipun demikian, dalam banyak kasus Anda sudah tahu bahwa koleksi Anda tidak null, karena kode ini hanya dipanggil dari kode yang mengetahui bahwa koleksi tersebut sudah ada, sehingga Anda tidak perlu sering-sering menaruh pemeriksaan null di sana. Tetapi jika Anda tidak tahu bahwa koleksi tersebut sudah ada, maka akan lebih masuk akal jika Anda melakukan pengecekan sebelum memanggil Any()
.
Apakah saya salah, sebagai klien dari kode ini, untuk mengharapkan bahwa misalnya
((int[])null).Any()
harus mengembalikanfalse
?
Ya. Pertanyaan yang dijawab oleh Any()
adalah "apakah koleksi ini mengandung elemen apa saja?" Jika koleksi ini tidak ada, maka pertanyaan itu sendiri tidak masuk akal; koleksi ini tidak dapat mengandung atau tidak mengandung apa pun, karena koleksi ini tidak ada.
Null berarti informasi yang hilang, bukan tidak ada elemen.
Anda dapat mempertimbangkan untuk menghindari null secara lebih luas, misalnya, menggunakan salah satu enumerable kosong bawaan untuk merepresentasikan koleksi tanpa elemen, bukan null.
Jika Anda mengembalikan null dalam beberapa situasi, Anda dapat mengubahnya untuk mengembalikan koleksi kosong. (Jika tidak, jika Anda menemukan null yang dikembalikan oleh metode library (bukan milik Anda), itu sangat disayangkan, dan saya akan membungkusnya untuk menormalkannya).
Lihat juga https://stackoverflow.com/questions/1191919/what-does-linq-return-when-the-results-are-empty