Saya mengaktifkan fitur ini dalam proyek yang memiliki kelas objek transfer data (DTO), seperti yang diberikan di bawah ini:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
Tapi saya mendapatkan kesalahan:
CS8618
: Properti Non-nullable 'ServiceUrl' tidak diinisialisasi. Pertimbangkan menyatakan properti sebagai tidak dapat dibatalkan.
Ini adalah kelas DTO, jadi saya tidak menginisialisasi properti. Ini akan menjadi tanggung jawab kode yang menginisialisasi kelas untuk memastikan bahwa properti tidak nol.
Misalnya, pemanggil dapat melakukan:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
Pertanyaan saya: Bagaimana menangani kesalahan seperti itu di kelas DTO ketika konteks nullability C # 8 diaktifkan?
Plain Old C# Object
. Hanya objek seperti yang lain, tanpa mewarisi dari kelas khusus apa pun. Saya curiga Anda memiliki pertanyaan yang berbeda . Cara membuat DTO -Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
kelas harus selalu dalam keadaan valid. Jikanull
tidak diizinkan, properti tidak boleh nol. Mungkin, alih-alih string dasar Anda harus menggunakan kelas khusus untuk URL yang dapat memiliki nilai atauNone
`Hilang`, seperti kelas Opsi di F #. C # 8 memungkinkan Anda untuk menulis kelas seperti itu dan memeriksanya dengan pencocokan polapublic string ServiceUrl { get; set; } = default! ;
. Saya berharap Roslyn mungkin di masa depan memiliki cara untuk menangani inisialisasi Terlambat di luar ruang lingkup aktor. Saya menggunakan MayBe <T> (seperti kelas Opsi), tetapi saya beralih ke Jenis Referensi yang dapat dibatalkan dalam c # 8 untuk kode baru.Jawaban:
Solusi berikutnya direkomendasikan oleh EF Core & EF6, lihat
1) Dengan menginisialisasi
null!
dengan operator yang pemaaf2) Menggunakan bidang dukungan:
sumber
!
operator.Jika tidak dapat dibatalkan, lalu apa yang dapat dilakukan kompiler ketika objek diinisialisasi?
Nilai default dari string adalah nol, jadi Anda akan melakukannya
baik perlu menetapkan nilai default string dalam deklarasi
public string ServiceUrl { get; set; } = String.Empty;
Atau inisialisasi nilai dalam konstruktor default sehingga Anda akan menghilangkan peringatan
Gunakan
!
operator (yang tidak bisa Anda gunakan)Buat itu nullable seperti yang disebutkan robbpriestley.
sumber
ServiceUrl'
tidak boleh = String.Empty. Ada properti lain dari tipe kompleks yang tidak bisa nol, jadi saya gunakandefault
seperti: 'public MyClass MyProperty {get; set; } = default! 'Untuk menghentikan peringatan. Kelas ini (dan lainnya) adalah konstruktor tanpa parameter dan akhir-akhir ini diinisialisasi di luar ruang lingkup ctor.Hal lain yang mungkin berguna dalam beberapa skenario:
Dapat digunakan di atas anggota atau tipe keseluruhan.
Namun hal lain yang perlu dipertimbangkan adalah menambahkan
#nullable disable
di atas file untuk menonaktifkan referensi nullable untuk seluruh file.sumber