Bisakah Anda jelaskan kepada saya apa where T : class, new()
artinya di baris kode berikut?
void Add<T>(T item) where T : class, new();
c#
generics
type-constraints
Rawhi
sumber
sumber
Jawaban:
Itu adalah kendala pada parameter generik
T
. Itu harus berupaclass
(tipe referensi) dan harus memiliki konstruktor default parameter-kurang publik.Itu berarti
T
tidak bisa menjadiint
,float
,double
,DateTime
atau lainnyastruct
(value type).Itu bisa berupa
string
, atau jenis referensi khusus lainnya, asalkan memiliki konstruktor default atau kurang parameter.sumber
new()
secara spesifik menentukan "harus memiliki konstruktor tanpa parameter publik"Itu adalah batasan tipe generik. Dalam kasus Anda ada dua:
Berarti tipe tersebut
T
harus tipe referensi (bukan tipe nilai).Berarti tipe tersebut
T
harus memiliki konstruktor tanpa parameter. Memiliki batasan ini akan memungkinkan Anda untuk melakukan sesuatu sepertiT field = new T();
dalam kode Anda yang tidak dapat Anda lakukan sebaliknya.Anda kemudian menggabungkan keduanya menggunakan koma untuk mendapatkan:
sumber
di mana T: struct
Argumen tipe harus tipe nilai. Jenis nilai apa pun kecuali Nullable dapat ditentukan. Lihat Menggunakan Jenis Nullable (Panduan Pemrograman C #) untuk informasi lebih lanjut.
dimana T: kelas
Argumen tipe haruslah tipe referensi, termasuk kelas, antarmuka, delegasi, atau tipe array apa pun. (Lihat catatan di bawah.)
di mana T: new () Argumen tipe harus memiliki konstruktor tanpa parameter publik. Ketika digunakan bersama dengan batasan lain, batasan baru () harus ditentukan terakhir.
di mana T: [nama kelas dasar]
Argumen tipe harus atau berasal dari kelas dasar yang ditentukan.
di mana T: [nama antarmuka]
Argumen tipe harus atau mengimplementasikan antarmuka yang ditentukan. Beberapa batasan antarmuka dapat ditentukan. Antarmuka pembatas juga bisa bersifat generik.
dimana T: U
Argumen tipe yang disediakan untuk T harus atau berasal dari argumen yang disediakan untuk U. Ini disebut batasan tipe polos.
sumber
class
&new
2 kendala pada parameter tipe generikT
.Masing-masing memastikan:
class
new
Kombinasi mereka berarti bahwa tipe tersebut
T
haruslah Tipe Referensi (tidak boleh menjadi Tipe Nilai ), dan harus memiliki konstruktor tanpa parameter.Contoh:
sumber
new (): Menentukan batasan new () berarti tipe T harus menggunakan konstruktor tanpa parameter, sehingga objek dapat dipakai dari situ - lihat Konstruktor default .
class: Berarti T harus menjadi tipe referensi sehingga tidak bisa berupa int, float, double, DateTime atau struct lainnya (tipe nilai).
sumber
Itu berarti tipe itu
T
harus kelas dan memiliki konstruktor yang tidak mengambil argumen apa pun.Misalnya, Anda harus dapat melakukan ini:
sumber
dimana (C # Referensi)
Jadi seharusnya,
T
harus berupa kelas, dan memiliki parameterless yang dapat diakses - atau konstruktor default.sumber
Apa yang muncul setelah "Di mana" adalah kendala pada tipe T generik yang Anda nyatakan, jadi:
kelas berarti bahwa T harus kelas dan bukan tipe nilai atau struct.
baru () menunjukkan bahwa kelas T harus memiliki konstruktor default bebas parameter publik yang telah ditentukan.
sumber
Ini disebut 'kendala' pada parameter generik T. Ini berarti bahwa T harus menjadi tipe referensi (kelas) dan harus memiliki konstruktor default publik.
sumber
Ini adalah bagian dari mekanisme Generics, di mana kata kunci menambahkan batasan pada tipe apa yang harus diterapkan agar dapat digunakan sebagai parameter tipe.
sumber
ketika menggunakan kelas dalam batasan itu berarti Anda hanya bisa menggunakan tipe Referensi, hal lain yang harus ditambahkan adalah kapan harus menggunakan kendala baru () , itu harus menjadi hal terakhir yang Anda tulis dalam istilah Kendala.
sumber