Saya melihat fitur C # baru dari tupel. Saya penasaran, masalah apa yang dirancang untuk diselesaikan oleh tupel?
Untuk apa Anda menggunakan tupel di aplikasi Anda?
Memperbarui
Terima kasih atas jawabannya sejauh ini, izinkan saya melihat apakah ada hal-hal yang terlintas dalam pikiran saya. Contoh yang baik dari tupel telah ditunjukkan sebagai koordinat. Apakah ini terlihat benar?
var coords = Tuple.Create(geoLat,geoLong);
Kemudian gunakan tupel seperti ini:
var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");
Apakah itu benar?
Jawaban:
Saat menulis program, sangat umum untuk ingin secara logis mengelompokkan satu set nilai yang tidak memiliki kesamaan yang cukup untuk membenarkan pembuatan kelas.
Banyak bahasa pemrograman memungkinkan Anda untuk secara logis mengelompokkan sekumpulan nilai yang tidak terkait tanpa membuat tipe hanya dengan satu cara:
Logikanya ini persis sama dengan metode M yang mengambil satu argumen yang merupakan 3-tupel dari int, string, double. Tapi saya harap Anda tidak benar-benar membuat:
kecuali MArguments memiliki arti lain dalam logika bisnis.
Konsep "mengelompokkan sekelompok data yang tidak terkait dalam beberapa struktur yang lebih ringan daripada kelas" berguna di banyak tempat, tidak hanya untuk daftar parameter formal metode. Ini berguna ketika sebuah metode memiliki dua hal untuk dikembalikan, atau ketika Anda ingin memasukkan kamus dari dua data, bukan satu, dan seterusnya.
Bahasa seperti F # yang mendukung jenis tuple secara native memberikan banyak fleksibilitas kepada penggunanya; mereka adalah kumpulan tipe data yang sangat berguna. Tim BCL memutuskan untuk bekerja dengan tim F # untuk membuat standarisasi pada satu jenis tupel untuk kerangka kerja sehingga setiap bahasa dapat memanfaatkannya.
Namun, saat ini belum ada dukungan bahasa untuk tupel di C #. Tuple hanyalah tipe data lain seperti kelas kerangka lainnya; tidak ada yang istimewa dari mereka. Kami sedang mempertimbangkan untuk menambahkan dukungan yang lebih baik untuk tupel dalam versi hipotetis C # yang akan datang. Jika ada yang memiliki pemikiran tentang fitur apa yang melibatkan tupel yang ingin Anda lihat, saya akan dengan senang hati menyampaikannya kepada tim desain. Skenario realistis lebih meyakinkan daripada renungan teoretis.
sumber
Item1
,,Item2
dll ... Jika tuple pernah mencapai dukungan bahasa di C #, akan sangat bagus untuk mengizinkan anggotanya diberi nama (atau setidaknya alias) dengan cara yang memungkinkan kode yang menggunakan agar lebih bisa dimengerti. Dalam masa depan yang hipthetis, saya juga ingin melihat tupel dengan "bentuk" yang sesuai sebagai parameter hukum untuk metode yang mengambil parameter individu (dan sebaliknya). Jadi,Tuple<int,string,bool>
bisa diteruskan keM(int,string,bool)
. Ini akan membuat metode memo menjadi lebih mudah.public
akses, tipe anonimstruct
dengan anggota yang tidak disebutkan namanya . Saya lebih suka programmer menulisstruct
dengan nama anggota dan mengembalikannya, daripada harus berurusan dengantuple
yang tidak memberi tahu saya apa pun tentang semantik anggotanya.Tuple menyediakan implementasi koleksi yang tidak dapat diubah
Selain dari penggunaan umum tupel:
Objek yang tidak dapat diubah pada dasarnya aman untuk thread:
Dari "Objek Abadi" di wikipedia
sumber
Ini memberikan alternatif untuk
ref
atauout
jika Anda memiliki metode yang perlu mengembalikan beberapa objek baru sebagai bagian dari responsnya.Ini juga memungkinkan Anda untuk menggunakan tipe bawaan sebagai tipe kembalian jika yang perlu Anda lakukan hanyalah menggabungkan dua atau tiga tipe yang ada, dan Anda tidak ingin menambahkan kelas / struct hanya untuk kombinasi ini. (Pernah berharap suatu fungsi dapat mengembalikan tipe anonim? Ini adalah jawaban parsial untuk situasi itu.)
sumber
Memiliki tipe "pasangan" sering kali membantu, hanya digunakan dalam situasi cepat (seperti mengembalikan dua nilai dari sebuah metode). Tuple adalah bagian sentral dari bahasa fungsional seperti F #, dan C # mengambilnya di sepanjang jalan.
sumber
sangat berguna untuk mengembalikan dua nilai dari suatu fungsi
sumber
Secara pribadi, saya menemukan Tuple menjadi bagian berulang dari perkembangan ketika Anda berada dalam siklus investigasi, atau hanya "bermain". Karena Tuple bersifat generik, saya cenderung memikirkannya saat bekerja dengan parameter generik - terutama saat ingin mengembangkan bagian kode generik, dan saya mulai dari bagian akhir kode, daripada bertanya pada diri sendiri "bagaimana saya akan menyukai panggilan ini untuk melihat?".
Cukup sering saya menyadari bahwa koleksi yang dibentuk Tuple menjadi bagian dari sebuah daftar, dan menatap List> tidak benar-benar mengungkapkan maksud dari daftar tersebut, atau cara kerjanya. Saya sering "hidup" dengannya, tetapi mendapati diri saya ingin memanipulasi daftar, dan mengubah nilai - pada titik mana, saya tidak perlu membuat Tuple baru untuk itu, jadi saya perlu membuat kelas atau struct saya sendiri untuk menahannya, jadi saya bisa menambahkan kode manipulasi.
Tentu saja, selalu ada metode ekstensi - tetapi sering kali Anda tidak ingin memperluas kode tambahan itu ke implementasi umum.
Ada kalanya saya ingin mengekspresikan data sebagai Tuple, dan tidak memiliki Tupel yang tersedia. (VS2008) dalam hal ini saya baru saja membuat kelas Tuple saya sendiri - dan saya tidak membuatnya aman untuk thread (tidak dapat diubah).
Jadi saya kira saya berpendapat bahwa Tuple adalah pemograman malas dengan mengorbankan kehilangan nama jenis yang menjelaskan tujuannya. Biaya lainnya adalah Anda harus mendeklarasikan tanda tangan Tuple di mana pun itu digunakan sebagai parameter. Setelah sejumlah metode yang mulai terlihat membengkak, Anda mungkin merasa seperti saya, bahwa ada baiknya membuat kelas, karena membersihkan tanda tangan metode.
Saya cenderung memulai dengan menjadikan kelas sebagai anggota publik dari kelas yang sudah Anda kerjakan. Tetapi saat itu melampaui sekadar kumpulan nilai, ia mendapatkan file itu sendiri, dan saya memindahkannya dari kelas yang memuatnya.
Jadi dalam retrospeksi, saya percaya saya menggunakan Tuple ketika saya tidak ingin pergi dan menulis kelas, dan hanya ingin memikirkan tentang apa yang saya tulis sekarang. Yang berarti tanda tangan Tuple dapat berubah cukup banyak dalam teks setengah jam sementara saya mencari tahu data apa yang saya perlukan untuk metode ini, dan bagaimana ia mengembalikan nilai apa pun yang akan dikembalikannya.
Jika saya mendapat kesempatan untuk merefaktor kode, maka sering kali saya akan mempertanyakan tempat Tuple di dalamnya.
sumber
Pertanyaan lama sejak 2010, dan sekarang di 2017 Dotnet berubah dan menjadi lebih pintar.
C # 7 memperkenalkan dukungan bahasa untuk tupel, yang memungkinkan nama semantik untuk bidang tupel menggunakan jenis tupel baru yang lebih efisien.
Di vs 2017 dan .Net 4.7 (atau menginstal paket nuget System.ValueTuple), Anda dapat membuat / menggunakan tupel dengan cara yang sangat efisien dan sederhana:
Mengembalikan lebih dari satu nilai dari sebuah metode:
Untuk lebih jelasnya baca: https://docs.microsoft.com/en-us/dotnet/csharp/tuples
sumber
Tuple sering digunakan untuk mengembalikan beberapa nilai dari fungsi saat Anda tidak ingin membuat tipe tertentu. Jika Anda terbiasa dengan Python, Python sudah memiliki ini sejak lama.
sumber
Menampilkan lebih dari satu nilai dari sebuah fungsi. getCoordinates () tidak terlalu berguna jika hanya mengembalikan x atau y atau z, tetapi membuat kelas dan objek penuh untuk menampung tiga int juga tampaknya cukup kelas berat.
sumber
Penggunaan umum mungkin untuk menghindari pembuatan kelas / struct yang hanya berisi 2 bidang, sebagai gantinya Anda membuat Tuple (atau KeyValuePair untuk saat ini). Berguna sebagai nilai kembali, hindari melewatkan N keluar params ...
sumber
Saya menemukan KeyValuePair menyegarkan di C # untuk mengulangi pasangan nilai kunci dalam Kamus.
sumber
KeyValuePair
dapat dipandang sebagai solusi tujuan khusus. Dalam Python, melakukan iterasi atasdict
tupel just return (key, value).Ini sangat membantu saat mengembalikan nilai dari fungsi. Kami dapat memiliki beberapa nilai kembali dan ini cukup hemat dalam beberapa skenario.
sumber
Saya menemukan tolok ukur kinerja antara pasangan Tuple dan Key-Value ini dan mungkin Anda akan menganggapnya menarik. Singkatnya dikatakan bahwa Tuple memiliki keuntungan karena ini adalah kelas, oleh karena itu disimpan di heap dan bukan di tumpukan dan ketika diedarkan sebagai argumen, penunjuknya adalah satu-satunya hal yang berjalan. Tapi KeyValuePair adalah struct sehingga lebih cepat untuk dialokasikan tetapi lebih lambat saat digunakan.
http://www.dotnetperls.com/tuple-keyvaluepair
sumber