Pertanyaan Apa tujuan dari Tuple (T1) / Singleton di .net?


Salah satu Jenis Tuple di .net 4 adalah a Single-Element Tuple. Saya hanya ingin tahu apa tujuan dari struct ini?

Satu-satunya penggunaan yang saya lihat adalah ketika menggunakan dalam 8+ Tuple karena dapat ditetapkan untuk TRest, di mana itu benar-benar masuk akal. Itu saja? Atau apakah ada tujuan lain?


32
2018-06-25 19:55


asal


Jawaban:


Anda harus meminta desainer BCL untuk memastikan, tetapi saya menduga bahwa karena ada 1-tupel di dunia nyata, para penulis kerangka NET. Ingin memberikan simetri yang setara dalam implementasinya.

Tuples adalah implementasi NET. dari apa yang Anda anggap sebagai konsep matematika dari tuple.

Sekarang karena Anda meminta untuk menggunakan pemrograman Tuple<T>, Saya akan juga menjawab bahwa ada. NET bahasa (seperti F #) yang bisa digunakan Tuple<> untuk representasi hal-hal seperti mengembalikan nilai dari fungsi. Karena fungsi F # tentu bisa mengembalikan 1-tuple sebagai hasilnya - itu menambah simetri dan konsistensi pada perilaku dan nuansa bahasa.

Contoh Anda dengan 8+ tupel juga mungkin sah, karena itu Rest properti bisa menjadi 1-tuple untuk mewakili "overflow".


17
2018-06-25 20:01



Tuples otomatis diterapkan IStructuralComparable dan IStructuralEquatable, antara lain. Ini memungkinkan tuples untuk dibandingkan dan diurutkan langsung dari kotak. Dari artikel Bill McCarthy edisi Desember 2009 Majalah Visual Studio, "Jenis dan Tuples dalam .NET 4":

Meskipun tupel mungkin terlihat sederhana dan tidak mencolok, mereka memang menyediakan pengetikan yang kuat dan fungsi perbandingan dan kesetaraan yang penting. Tuple berguna di seluruh metode, kelas atau bahkan batas mesin.

Dengan menempatkan tipe data Anda ke dalam tuple, bahkan hanya satu elemen, Anda dijamin kekekalan, keseragaman, dan komparabilitas. Untuk tupel yang hanya terdiri dari satu elemen, manfaat utama menggunakan tuple akan menjadi kekal: setelah tuple dibuat, data itu tidak pernah dapat berubah untuk kehidupan tuple.


7
2018-06-25 20:12



Semua jenis tupel diimplementasikan ITuple, jadi saya kira ketika Anda ingin memiliki tipe kembalinya itu ITuple, Anda perlu opsi memiliki satu nilai, seperti yang Anda sarankan.


4
2018-06-25 20:04



Meskipun ini adalah thread lama, saya sedang mempersiapkan jawaban untuk Mengapa menggunakan 1-tuple, Tuple <T1> di C #? , yang sekarang ditandai sebagai duplikat.

Satu mungkin penggunaan 1-Tuple, adalah mengembalikan instance null jika tidak ada nilai, tetapi nol dari nilai item itu sendiri, tidak berarti tidak ada hasil.

Misalnya (bukan contoh kehidupan nyata yang sangat baik, tetapi mudah-mudahan ini menyampaikan maksudnya)

    static List<string> List = new List<string> {"a", "b", null, "c"};

    static Tuple<string> GetItemAtIndex(int index)
    {
        if (index < 0 || index >= List.Count)
            return null;
        return Tuple.Create(List[index]);
    }

Kode panggilan akan tahu bahwa ketika tupel itu sendiri adalah null, itu tidak ada dalam daftar, tetapi jika Item1 adalah null, sebenarnya ada item null dalam daftar. Tentu saja dalam contoh ini, banyak workarounds yang lebih baik ada, tetapi bisa juga berlaku untuk hasil dari database: tidak ada hasil yang ditemukan atau hasil yang null.

Memperluas logika yang sama, Tuple dapat digunakan untuk dengan mudah membuat metode umum yang dapat mengembalikan null untuk jenis apa pun. Sebagai contoh

    static Tuple<T> GetSomething<T, RecType>(RecType rec, Func<RecType, T> fn)
    {
        if (rec == null) return null;
        //extra example, access would be checked by something like CheckCurrentUserAccess(rec)
        bool AccesDenied = true;
        if (AccesDenied) return null; //sometimes you don't want to throw an exception ;)

        return Tuple.Create(fn(rec));
    }

Anda bisa kembali Nullable<T>, tetapi itu hanya akan berfungsi untuk struct, di mana ini bekerja dengan tipe apa saja, meskipun int, string, int?, MyClass, dll


3
2018-06-30 10:06