2016-08-09 4 views
2

構造型の配列が不明です。私はいくつかのインデックスを取得しようとしているとき、私は、このオブジェクトの新しいインスタンスを取得します:Array.GetValue()は構造体オブジェクトの新しいインスタンスを返します

var inst = ((SomeStruct)((Array)arrOfSomeStruct).GetValue(0)); 

arrOfSomeStruct [0]異なるインスタンスです。

最高または配列項目の元のインスタンスを取得するための最速方法、およびNOT []演算子を使用しては何ですか?

+0

あなたはそれをやろうとしているが、ソース 'struct'が必要ですか? – Enigmativity

+0

あなたは本当に何を達成しようとしていますか? 'var inst2 = inst1;'のように、構造体の値を変数に__assign__すると、その値がコピーされ、新しいインスタンスが作成されます。 'var inst =(SomeStruct)obj;'のように 'object'ボックスに存在していた構造体の値を__unbox__すると、新しい値/インスタンスが作成されます。 'public object GetValue(){/ * ... */return someStruct/* boxing!}のように、暗黙のうちに構造体の値を__box__するとすぐに! * /; } '、新しいインスタンスが新しいボックスに作成されます。あなたはこのすべてを気にするので、あなたの構造体は変更可能か不変か? –

+0

'var inst = orig_arr.GetValue(0); inst.x = 5; // Now orig_arr.x!= inst.x' – Guy

答えて

2

を使用する必要がありますしたいように動作する

。それはコピーされ、参照されません。これは、GetValueメソッド(例:this[index])だけでなく、構造体を持つすべての交換でも同じです。 Jeppe Stig Nielsenとして

コメント:

を...構造体値の箱入りコピーへの参照を返す.GetValue(0)値型の配列のために。一方、[0]は元の構造体の値です。変数に代入する場合は、var valueCopy = arr[0];のようにコピーが作成されます。しかし、これは主に可変値型に関係します。 structに構造体の値を変更するメンバがある場合、arr[0].MutateValue();は元のものに変更を加えます。もちろんvalueCopy.MutateValue();はコピーを変更します。

あなたが持っている最良の選択肢は、構造体をオブジェクトにすることです。クラスに移動する。いくつかの極端な例で

、危険なコードの使用は最後の手段です:

unsafe 
{ 
    Point p = new Point(1, 2); 
    Point*[] points = new Point*[] { &p }; 

    Point* p2 = points[0]; 

    p2->X = 2; // this changes both p and p2 
} 
+2

明示するために、値型の配列の場合、 '.GetValue(0)'は構造体値の_boxedコピー_への参照を返します。一方、 '[0]'は元の構造体の値です。変数に代入すると、 'var valueCopy = arr [0];'のようにコピーが行われます。しかし、これは主に可変値型に関係します。 structに構造体の値を変更するメンバがある場合、 'arr [0] .MutateValue();'は元のものに変更を加えます。もちろん、 'valueCopy.MutateValue();'はコピーを変更します。 –

+0

さて、非常に明確です。明確化のためにありがとう。 –

4

value typeの場合、オリジナルを取得できません。 Value Typeは、メソッドから返されるか、メソッドに渡されるとコピーされます。あなたはこれが構造体との相互作用のデフォルトの動作ですreference type(class)

関連する問題