Saya biasanya menggunakan KeyValuePair<TKey,TValue>
tipe setiap kali saya memiliki data yang terkait dengan pasangan dalam arti bahwa satu adalah kunci bagi yang lain. Jika datanya tidak terkait maka Tuple<T1,T2>
jenisnya lebih masuk akal dan saya akan melakukannya.
Sekarang saya baru saja membaca artikel ini tentang mengapa umumnya menghindari KeyValuePair<TKey,TValue>
dan memilih Tuple<T1,T2>
. Argumen utama adalah manfaat kinerja Tuple<T1,T2>
.
Di luar kinerja, adakah alasan KVP menjadi pilihan yang lebih baik daripada Tuple<T1,T2>
?
KeyValuePair
adalah kunci dan nilai, aTuple<T1,T2>
hanyalah sepasang nilai yang sama . Anda juga bisa bertanya: "mengapa saya harus menggunakanList<Class>
jika saya dapat menggunakanDictionary<A,B>
".Jawaban:
Yah, jenisnya bisa dianggap nama yang buruk, untuk satu. KeyValuePair seperti yang dinamai harus mewakili kunci dan nilai. Bagaimana jika kedua objek Anda sebenarnya bukan kunci dan nilai, hanya dua hal? Jika saya melihat metode atau properti yang memiliki tipe
KeyValuePair<TKey, TValue>
, saya berharap nilai KVP menjadi kunci dan nilai. Ini benar-benar hanya masalah mengkomunikasikan niat dan menjelaskan kepada diri Anda sendiri di masa depan, atau mungkin anggota tim lainnya. Tupel tidak menunjukkan asosiasi semacam itu.Tupel juga memudahkan untuk menambahkan nilai lain, menjadikannya 3-tupel (atau triplet, bagaimanapun Anda ingin menyebutnya). Beberapa bahasa NET, seperti F #, memiliki sintaks khusus di sekitar tupel juga.
Untuk perspektif implementasi,
Tuple
banyak halKeyValuePair
tidak. Tupel sebanding, mereka mengimplementasikan antarmukaIComparable
danIStructuralEquatable
, sehingga memudahkan untuk membandingkan dua tupel.sumber
KeyValuePair
adalah struct danTuple
merupakan kelas.Itulah perbedaan utama yang mempengaruhi bagaimana objek disalin baik dengan referensi maupun nilai.
dan karenanya
Tuple<T1,T2>
ketika diedarkan hanya menggunakan "4byte" di OS 32bit, sedangkanKeyValuePair<K,V>
membutuhkan lebih banyak berdasarkan "K dan V"Bagaimanapun membandingkan Tuple dan KeyValuePair bukanlah ide yang baik (tidak masuk akal bagi saya) karena keduanya memiliki tujuan yang berbeda.
sumber
Terlepas dari semantiknya, kinerja mungkin menjadi pertimbangan penting saat Anda mempertimbangkan kedua opsi tersebut. Seperti yang disebutkan sebelumnya,
KeyValuePair
adalah tipe nilai (struct), sedangkanTuple<>
adalah tipe referensi (kelas). Oleh karena itu, theKeyValuePair
dialokasikan di stack danTuple<>
dialokasikan di heap, dan pilihan optimal biasanya ditentukan oleh argumen klasik Stack vs. Heap Memory Allocation . Singkatnya, ruang tumpukan terbatas, tetapi umumnya memiliki akses yang sangat cepat. Memori heap jauh lebih besar tetapi agak lebih lambat.KeyValuePair<T1, T2>
mungkin menjadi pilihan yang lebih baik jika kedua kunci dan nilai jenis yang primitif (jenis nilai sepertiint
,bool
,double
, dll) atau struct dari ukuran kecil. Dengan tipe primitif pada stack, alokasi dan deallocation sangat cepat. Ini benar-benar dapat memengaruhi performa, terutama sebagai argumen untuk panggilan metode rekursif.Di sisi lain,
Tuple<T1, T2>
kemungkinan adalah pilihan yang lebih baik jika salah satuT1
atauT2
tipe referensi (seperti kelas). AKeyValuePair
yang berisi pointer ke jenis referensi (sebagai kunci atau tipe nilai) semacam mengalahkan tujuan karena objek tetap perlu dicari di heap.Ini patokan yang saya temukan secara online: Tuple vs. KeyValuePair . Satu-satunya masalah dengan tolok ukur ini adalah bahwa mereka menguji
KeyValuePair<string, string>
vs.Tuple<string, string>
, danstring
tipenya adalah tipe yang tidak biasa dan khusus dalam .NET yang dapat berperilaku seperti tipe nilai dan / atau tipe referensi tergantung pada konteks eksekusi. Saya yakin ituKeyValuePair<int, int>
akan menjadi pemenang yang jelas melawanTuple<int, int>
. Meskipun terdapat kekurangan, namun, hasilnya menunjukkan bahwa perbedaan kinerja dapat menjadi signifikan:sumber
Anda benar-benar menanyakan pertanyaan yang salah, pertanyaan yang tepat adalah menggunakan Kelas (Tuple) _ lebih baik daripada Struct (KVP) dalam hal ini jawabannya adalah untuk apa Anda ingin menggunakannya dan jawabannya diberikan di sini Struktur versus kelas
sumber