Saya memiliki DTO yang diisi dengan membaca dari tabel DynamoDB. Katakan seperti ini saat ini:
public class Item
{
public string Id { get; set; } // PK so technically cannot be null
public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks
public string Description { get; set; } // can be null
}
Apakah ada praktik terbaik yang dikembangkan untuk menangani ini? Saya lebih suka menghindari konstruktor non-parameterless karena itu bermain buruk dengan ORM di Dynamo SDK (dan juga yang lain).
Rasanya aneh bagi saya untuk menulis public string Id { get; set; } = "";
karena ini tidak akan pernah terjadi karena Id
ini adalah PK dan tidak pernah bisa menjadi nol. Apa gunanya ""
bahkan jika itu entah bagaimana caranya?
Jadi ada praktik terbaik dalam hal ini?
- Haruskah saya menandai mereka semua
string?
dengan mengatakan bahwa mereka bisa nol meskipun beberapa tidak seharusnya. - Haruskah saya menginisialisasinya
Id
danName
dengan""
karena mereka harus tidak pernah batal dan menunjukkan ini maksud meskipun""
tidak akan pernah digunakan. - Beberapa kombinasi di atas
Harap dicatat: ini tentang C # 8 jenis referensi yang tidak dapat dibatalkan Jika Anda tidak tahu apa yang sebaiknya tidak dijawab.
c#
c#-8.0
non-nullable
nullable-reference-types
Pengembang Inggris
sumber
sumber
#pragma warning disable CS8618
di bagian atas file.= ""
, Anda dapat menggunakan= null!
untuk menginisialisasi properti yang Anda tahu tidak akan pernah efektifnull
(ketika kompiler tidak memiliki cara untuk mengetahui hal itu). JikaDescription
secara hukum dapatnull
, harus dinyatakan astring?
. Atau, jika nullability memeriksa DTO lebih banyak gangguan daripada bantuan, Anda cukup membungkus jenis dalam#nullable disable
/#nullable restore
untuk mematikan NRT untuk jenis ini saja.Jawaban:
Sebagai opsi, Anda dapat menggunakan
default
literal dalam kombinasi dengannull forgiving operator
Karena DTO Anda diisi dari DynamoDB, Anda dapat menggunakan
MaybeNull/NotNull
atribut postcondition untuk mengontrol nullabilityMaybeNull
Nilai pengembalian yang tidak dapat dibatalkan dapat berupa nol.NotNull
Nilai pengembalian yang tidak dapat dibatalkan tidak akan pernah menjadi nol.Tetapi atribut ini hanya memengaruhi analisis nullable untuk penelepon anggota yang dianotasi dengannya. Biasanya, Anda menerapkan atribut ini untuk pengembalian metode, properti, dan pengambil pengindeks.
Jadi, Anda dapat mempertimbangkan semua properti Anda yang tidak dapat dibatalkan dan menghiasnya dengan
MaybeNull
atribut, yang menunjukkan mereka mengembalikannull
nilai yang mungkinContoh berikut menunjukkan penggunaan
Item
kelas yang diperbarui . Seperti yang Anda lihat, baris kedua tidak menunjukkan peringatan, tetapi yang ketiga tidakAtau Anda dapat membuat semua properti menjadi nullable dan digunakan
NoNull
untuk menunjukkan bahwa nilai pengembalian tidak dapatnull
(Id
misalnya)Peringatan akan sama dengan contoh sebelumnya.
Ada juga
AllowNull/DisallowNull
atribut prasyarat untuk parameter input, properti dan setter pengindeks, bekerja dengan cara yang sama.AllowNull
Argumen input yang tidak dapat dibatalkan dapat berupa null.DisallowNull
Argumen masukan yang dapat dibatalkan tidak boleh nol.Saya tidak berpikir itu akan membantu Anda, karena kelas Anda diisi dari database, tetapi Anda dapat menggunakannya untuk mengontrol nullability dari setter properti, seperti ini untuk opsi pertama
Dan untuk yang kedua
Beberapa detail bermanfaat dan contoh post / prasyarat dapat ditemukan di artikel devblog ini
sumber
Jawaban buku teks dalam skenario ini adalah menggunakan a
string?
untukId
properti Anda , tetapi juga menghiasinya dengan[NotNull]
atribut:Jadi, apa sebenarnya yang terjadi di sini?
string?
tipe kembali mencegah compiler dari peringatan Anda bahwa properti uninitialized selama konstruksi dan dengan demikian akan secara default untuknull
.[NotNull]
atribut mencegah peringatan ketika menetapkan properti ke variabel yang tidak dapat dibatalkan atau berusaha untuk menundanya karena Anda menginformasikan analisis aliran statis kompiler yang, dalam praktiknya , properti ini tidak akan pernahnull
.Untuk membantu Anda mempertahankan komitmen itu, Anda juga dapat membuat anotasi properti dengan
[DisallowNull]
atribut:Ini mungkin tidak relevan dalam kasus Anda karena nilai ditugaskan melalui database, tetapi
[DisallowNull]
atribut akan memberi Anda peringatan jika Anda pernah mencoba untuk menetapkan nilainull
(mampu)Id
, meskipun tipe pengembalian sebaliknya memungkinkan untuk itu menjadi nol . Dalam hal itu,Id
akan bertindak persis sepertistring
sejauh analisis aliran statis C # yang bersangkutan, sementara juga memungkinkan nilai untuk tetap diinisialisasi antara konstruksi objek dan populasi properti.sumber
String adalah tipe referensi dan selalu dapat dibatalkan, Anda tidak perlu melakukan sesuatu yang istimewa. Anda bisa memiliki masalah hanya nanti jika Anda ingin memetakan jenis objek ini ke yang lain, tetapi Anda bisa mengatasinya nanti.
sumber