Sepertinya saya benar-benar tidak ada jaminan bahwa variabel yang tidak dapat dibatalkan tidak akan pernah memiliki nol. Bayangkan saya memiliki kelas yang memiliki satu properti yang tidak dapat dibatalkan:
public class Foo
{
public Foo(string test)
{
Test = test;
}
public string Test {get;set;}
}
Sekarang yang mungkin tampak seperti sekarang tidak boleh nol. Tetapi jika kita mereferensikan kelas ini dengan pustaka lain yang tidak menggunakan konteks nullable, tidak ada yang menghentikan pengiriman nol di sana.
Apakah itu benar atau ada beberapa pemeriksaan runtime juga yang mungkin memastikan ini?
c#
c#-8.0
nullable-reference-types
Ilya Chernomordik
sumber
sumber
public void Foo(string test){...}
ataupublic Foo(string test){...}
?Jawaban:
Inilah yang dikatakan MS tentang ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ):
sumber
seseorang selalu bisa melakukannya
Mungkin Anda bisa menggunakan Domain Driven Design
sumber
Anda benar, kode lain yang tidak menggunakan fitur baru dapat menetapkan null untuk properti ini, tidak ada pemeriksaan run-time, itu hanya petunjuk pengubah.
Anda selalu bisa melakukannya sendiri jika Anda ingin pemeriksaan runtime:
Perhatikan bahwa Anda dapat menjamin tidak ada null di sebagian besar kode Anda, Anda hanya perlu menambahkan penjaga ke API Publik tingkat atas Anda dan memastikan kelas disegel dengan tepat, dll.
Tentu saja orang masih dapat menggunakan refleksi untuk memperbaiki kode Anda, tetapi kemudian pada mereka
sumber
Of course people can still use reflection to f*** your code up
, benar, benar memang. Anda pasti dapat menggunakan refleksi untuk melakukan ini, apakah itu disarankan , tidak , apakah orang masih melakukannya, ya.Bahkan dalam kode Anda sendiri, jika Anda memilih untuk melakukannya, Anda dapat lulus
null
, menggunakan operator null-forgiving.null!
dianggap tidak-nol sejauh analisis nullability kompiler yang bersangkutan.sumber
Untuk menangani cek nol dan juga membuat kode Anda dapat dibaca, saya sarankan pola Desain Obyek Null.
Lebih banyak membaca di sini:
https://www.c-sharpcorner.com/article/null-object-design-pattern/
Pada dasarnya, ini melibatkan pembuatan objek baru yang berasal dari antarmuka yang sama dan memiliki instance nol.
Contoh:
Nulls tidak dapat dihindari, tetapi mereka dapat diperiksa dengan bersih.
sumber