2016-06-19 13 views
0

私は初心者です。この問題はおそらく非常に明白ですが、私はそれに多くの問題を抱えています。変更されていないと配列が変更されます

次のコードでは、i2がiに設定されている場合、その後i2が変更されてもiは変更されません。ただし、arr2がarrに設定されている場合、arr2がその後に変更されるとarrも更新されます。

なぜですか?違いはなんですか?

static void Main(string[] args) 
{ 
    int i = 5; 
    int i2 = i; 

    Console.WriteLine(i);  //output is 5 

    i2 = i - 2; 

    Console.WriteLine(i);  //output is 5 

//------------------------------------------------------------------------------ 

    int[] arr = { 5 }; 
    int[] arr2 = arr; 

    Console.WriteLine(arr[0]); //output is 5 

    arr2[0] = arr[0] -2; 

    Console.WriteLine(arr[0]); //output is 3 

//--------------------------------------------------------------------- 

    Console.ReadKey(); 
} 
+1

[値型と参照型](https://msdn.microsoft.com/en-us/library/t63sy5hs.aspx)をお読みください。 'int'は値型で、 'array'(int [])は参照型です。 – Odrai

+0

質問の件名に言語や文脈を示すことも考えてください。この一般的なアドバイスは、最も関連性の高い回答を提供できる人から注目を集めるのに役立ちます。 – Carlos

答えて

2

声明

int[] arr2 = arr; 

は、新しい配列オブジェクトを作成していない、それだけでarrへの参照を割り当てます。そのため、arr2を変更すると、arrも変更されます。 int(またはInt32)は実際にはクラスではなく構造体であり、整数のメモリはヒープではなくスタックに割り当てられているため、intを持つ状況は異なります。ここでは詳細:C# Concepts: Value vs Reference Types

+0

歓声メイト:D:D –

0

はちょっと最初のケースでは、それらは、その結果、これらの変数はメモリマッピングによって相互に関連していない、変数です。 2番目のケースでは、答えが3であるために配列の参照を代入しています。また、arrに対して行った変更はarr2でも見つかります。

1

value typeであり、従って、ビット単位の値、割り当てるたびにコピーされますstructタイプですINT以下のように他の変数に変更すると、以下のコードでii2の両方に別のコピーがあり、変更すると他の変数には影響しません。 Array以下である第2の場合について

int i = 5; 
    int i2 = i; 

設計によってreference typeであるので、あなただけの他の配列変数に配列の参照を割り当てる(基本型System.Arayから継承)Classあります。したがって、同じものを変更することは、ヒープメモリ内に存在する同じ配列オブジェクトを参照しているので、他のものにも影響します。

int[] arr = { 5 }; 
    int[] arr2 = arr; 

MSDN に表示するアレイのマニュアルArray Class

関連する問題