Dalam proyek saya saat ini, saya menemukan persyaratan untuk membuat kelas generik dengan nama yang sama, tetapi jumlah parameter generik yang berbeda. Sebagai contoh:
MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>
Mengingat bahwa saya ingin semua ini di namespace yang sama, saya bingung bagaimana cara menyusun dan memberi nama kelas dan file saya?
Jika kita mengikuti gagasan bahwa kita harus memiliki kelas terbatas pada satu per file dan bahwa file harus dalam struktur folder yang mewakili hirarki namespace dan bahwa nama file harus sesuai dengan nama kelas, bagaimana cara menangani situasi ini ?
Apa yang sebenarnya saya tanyakan di sini adalah apa yang harus saya beri nama file yang berisi MyClass<T1>
, dan apa yang harus saya beri nama file yang berisi MyClass<T1, T2>
? Saya tidak bertanya apa nama parameter tipe seharusnya.
TKey, TValue
konvensi. Fungsi memilikiTResult
parameter tipe. Meskipun saya setuju bahwa Anda dapat menggunakanT1
,,T2
dll. Untuk sejumlah variabel parameter input yang tidak memiliki penggunaan spesifik sepertiTKey
danTValue
.Jawaban:
Dan seterusnya, di mana angka setelah backtick adalah jumlah parameter tipe generik. Konvensi ini digunakan oleh Microsoft.
Atau, Anda dapat menggunakan sesuatu seperti
yang mempertahankan tidak hanya jumlah parameter tipe generik, tetapi juga nama spesifiknya. Memang, itu tidak mempertahankan kurung sudut, tetapi kita tidak dapat memiliki semua yang kita inginkan dalam hidup ini, bukan?
sumber
Dalam kasus
Tuple
danAction
yang disebutkan Pete, Microsoft sendiri menggunakan satu file - lihat Tuple.cs dan Action.cs .Saya pikir itu sebagian tergantung pada apakah atau tidak fungsi untuk semua kelas pada dasarnya sama. Secara pribadi saya tidak suka kelas lumping ke dalam satu file, tetapi ini mungkin pengecualian. Dalam kode sumber tempat saya bekerja saya menambahkan kelas autogenerated (menggunakan T4)
NamedTuple
yang bertindak dengan cara yang samaTuple
, tetapi dengan nama string sebagai argumen pertama ke konstruktor.Untuk menjawab pertanyaan Anda, jika Anda tidak ingin menggunakan satu file, mungkin gunakan MyClass_1.cs untuk
MyClass<T1>
, MyClass_2.cs untukMyClass<T1, T2>
, dll.Namun, tidak ada opsi yang ideal, jadi saya cenderung menyarankan argumen "Microsoft melakukannya dengan cara ini, jadi ...".
sumber
Tuple
danAction
semuanya adalah delegasi; mereka tidak memiliki kode implementasi, jadi menempatkan semua variasi dalam file yang terpisah akan menjadi sia-sia. Buktikan saja bahwa setiap aturan memiliki pengecualian.Tuple
bukan merupakan delegasi, tetapi setiap implementasi tetap singkat.Func
.Pernahkah Anda bertanya pada diri sendiri, apakah kelas benar-benar memiliki maksud yang sama? Jika satu kelas lebih umum daripada yang lain, maka itu akan menjadi GenericClass , MoreGenericClass dan MostGenericClass . Bayangkan bahwa setiap parameter tipe kelas menambahkan dimensi baru ke kelas, sehingga mungkin membantu untuk bertanya dimensi apa itu.
Mari kita ambil contoh ini:
Container<Thing>
MetricContainer<Thing, Metric>
MetricTransportableContainer<Thing, Metric, Transport>
Saya sadar, ini bukan contoh terbaik, tetapi sangat ekspresif untuk menunjukkan tiga dimensi:
Jadi Anda dapat memodelkan transportasi mobil:
Transportasi cairan:
Transportasi energi:
Pengangkutan gula, sereal:
Oh, sungguh mengejutkan: a
List<T>
memiliki satu dimensi yang mewakili hal-hal yang dapat dipegang oleh daftar; dan ini adalahMap<T, S>
dengan dua dimensi yang mewakili hal-hal yang dapat dipegang oleh peta dan tombol akses.sumber
Tuple<T1>
,Tuple<T1, T2>
danTuple<T1, T2, T3>
ke dalam file CS terpisah dengan cara standar, tanpa bentrok nama?