2016-06-23 7 views
0

私は以下のようにタプルを定義したとします。c# - どのようにタプルへのポインタを持っていますか?

public Tuple<string, string> CValues = new Tuple<string, string>("abc", "def"); 

上記のタプルへのポインタとして機能する別の変数を定義するにはどうすればよいですか?これを達成する方法はありますか?

+1

:あなたは本当にその後、可変インスタンスをしたい場合は

独自のクラスを作成することができますか? – Candide

+2

'CValuesReference'は「参照」ではありませんか?あなたは、 'var whatever = CValuesReference'のようなものが欲しいということですか? –

+0

はいあなたは正しい@Maciej – Rama

答えて

2

.Net Tupleは、変更不可能な参照クラスです。基本的には既に基本的にはポインタに相当し、値を変更する方法はありません。新しいものを作成することしかできません。

この CValues"abc_x""def_y"を保持しているが、それは実際に新しいインスタンスの後にあなたが...新しいインスタンスが割り当てられていることを確認するために

var CValues = new Tuple<string, string>("abc", "def"); 

void ChangeCValues(ref Tuple<string, string> input) 
{ 
    values = new Tuple<string, string>(input.Item1 + "_x", input.Item2 + "_y") 
} 

refキーワードを使用することができます

からrefキーワードがあることを保証外部参照が更新されます。

あなたはCValuesするために別の変数を割り当てる場合は、同じインスタンスを指しますが、再割り当ては別のものにそれを指すようになります...

var altValues = CValues; 
// altValues.Item1 will be "abc" 

ChangeCValues(ref altValues); 
// altValues.Item1 will be "abc_x", but CValues.Item1 will be "abc" 

あなたがする何をしようとしていますか?何をしようとする

class MyMutableTuple<T1, T2> { 
    public T1 Item1 {get; set;} 
    public T2 Item2 {get; set;} 
} 

var CValues = new MyMutableTuple<string, string>("abc", "def"); 

CValues.Item1 = "ghi"; // Works! 
+0

この回答は、私にとって多くの誤解を解消しました。私の唯一の疑問は、 'CValues'に含まれている値を' altValues'を使ってrefを使わずに変更できるかどうかです。 – Rama

+0

@Rama 'CValues'に含まれる値を変更することはできません。新しい' Tuple'を作成して割り当てることはできますが、値を変更することはできません。 – Keith

+0

そうですね。しかし、新しいタプルを作成し、それを 'altValues'に代入しても' CValues'は変わりません。それは私の問題 – Rama

0

タプルは構造体ではないクラスです。したがって、変数はポインタです。

+0

私の質問は、別の名前でこれに別のポインタをしたいのですが? 'public Tuple <文字列、文字列> ptr = CValues; '仕事? – Rama

+0

[* references *](https://msdn.microsoft.com/en-us/library/490f96s2.aspx)と[* pointers *](https://msdn.microsoft)の両方を持つC#などの言語では、 .com/en-us/library/y31yhkeb.aspx)、これらのうちの1つに*間違った名前を使用することは、常に避けるべきです。変数は* reference *です。 –

+0

@Rama:私は優れた方法を知っています:試してみてください。なぜあなたはそのプログラムの断片が何をしているのか尋ねていますか?コードを記述して実行すると、そのコードが何をしているのかがわかります。 –

関連する問題