50650


タプル式なのですが、`//ここです`のコードの部分は何が利点なのでしょうか？  
タプル型を返す？関数の`GetMember(string s, int n){}`の利点は理解できますが  
`t1`の部分の利点が知りたいです。

[code]

    class sample
    { 
        static void Main()
        {
            (string, int) GetMember(string s, int n)
            {
                string a = s;
                int b = n;
                return (a, b);
            }
            var (aa, x) = GetMember("bbb", 4);
    
            (string s1, int n1) t1 = ("qqq", 2);  //ここです。
            var (a2, x2) = GetMember(t1.s1, t1.n1);
    
            (int a, int b) t2 = (3, 3);
    
            Console.WriteLine(a2);
            Console.ReadKey();
        }
    }
    
[/code]


CC BY-SA 4.0
2018-11-25T11:06:10.940
50611
2018-12-08T01:53:25.973
2018-12-08T01:53:25.973
19110
question
c#
タプル分解の利点が知りたい


なんか見るからに説明のための説明として「こんなことができますよ」という例が挙げてあるだけのように見えます。そこに「利点」を探しても仕方ないのでは？

`tuple` も結局のところ「複数個の値をひとつにまとめて扱う」という点では `class` や `struct` と同じ機能なわけです。 `class`
の場合、事前に＝「使う場所とは離れた場所」で定義が必要で、再利用が可能なわけです。 `tuple` の場合、今ここでしか必要のない値のセットを ad hoc
（やっつけ）に、使う場所で定義することができて、なおかつ再利用しづらい＝元作者による「他のところで再利用すんなゴラァ」の意思表明と読むことができます。単純なものを使い捨てるには
`tuple` のほうが手早いっすね。


CC BY-SA 4.0
2018-11-26T10:22:45.197
50638
2018-11-26T10:22:45.197
8589
50611
answer


メソッドの引数は複数指定できるように、戻り値も複数指定したい場合があり、それを実現するのが多値であり、C#におけるその実装がタプルです。  
タプルはあくまで多値を表すための便宜的な構造でしかなく、それ自体に意味を持たせる目的はありません。ですので、タプルのまま扱うのではなく、早々に分解し個別の値として扱うことに意義があります。タプル分解構文が導入された理由もそこにあります。[タプルとその他の型の分解](https://docs.microsoft.com/ja-
jp/dotnet/csharp/deconstruct)も参照してください。

なお、C#がよく参考にする[F#言語](https://docs.microsoft.com/ja-jp/dotnet/fsharp/language-
reference/)を見るといろいろな機能を知ることができます。F#には[パターンマッチ](https://docs.microsoft.com/ja-
jp/dotnet/fsharp/language-reference/pattern-
matching)という機能があり、これがタプル分解の元ネタとなっています。F#の場合、タプルだけでなく配列やリスト・レコードなど多くの型を分解でき、なおかつ再帰的にどこまででも分解することができます。対するC#のタプル分解は１階層のみのため、あまり存在意義を発揮できていないかもしれませんが、今後のバージョンで強化されるという話もあります。


CC BY-SA 4.0
2018-11-26T10:42:18.283
50639
2018-11-26T10:42:18.283
4236
50611
answer


> 関数のGetMember(string s, int n){}の利点は理解できますが

おそらく多値戻り値の利点は理解されていて、なぜt1の行の代入でタプルを使っているかって事ですよね？この認識で話を進めますが、おそらくGetMemberの引数に渡すパラメータはt1と言う名前にしたかったんじゃないでしょうか？GetMemberの引数をt1とすれば他では使われる必要がないからとかですかね？作った人に聞いてみるのが早いかもしれません。


CC BY-SA 4.0
2018-11-26T15:40:26.377
50650
2018-11-26T15:40:26.377
24385
50611
answer