2015-06-21 3 views
-2

Мне нужно присвоить значения статического массива другому статическому массиву. Но когда я это делаю, если я меняю первый массив, он также влияет на другой. Как мне присвоить эти значения?C# Статические массивы - присвоение значений статического массива другому статическому массиву

я упростил мою проблему с этим, например:

class Program 
{ 
    static double[] a1; 
    static double[] a2; 

    static double b1; 
    static double b2; 

    static void Main(string[] args) 
    { 
     //First example 
     a1 = new double[5] { 1,2,3,4,5 }; 
     a2 = new double[5] { 6,7,8,9,10}; 

     a2 = a1; 
     a1[2] = 99; //I change only a1 

     Console.WriteLine(a1[2]);   
     Console.WriteLine(a2[2]); 
     //Result is: 
     // 99 
     // 99 why is a2 changed too?  


     //Second example 
     b1 = new double(); 
     b2 = new double(); 
     b1 = 10; 
     b2 = 20; 

     b2 = b1; 
     b1 = 33; 

     Console.WriteLine(b1); 
     Console.WriteLine(b2); 
     //Result is: 
     // 33  
     // 10 this is okay 
    } 
} 

Так что, когда я Asign a2 = a1, a2 получает адрес a1 в или что-то? Но почему этого не происходит с обычными переменными, как в моем втором примере?

+0

https://msdn.microsoft.com/en-us/library/ms173109.aspx – Rhumborl

+0

[Типы ссылок и типы значений] (http://www.albahari.com/valuevsreftypes.aspx) Я действительно предлагаю вам понять эта концепция – Steve

ответ

0

при назначении a2 = a1 вы сделать неглубокий копия. Ссылка (как-то эквивалентная старому указателю) на a1 скопирована на a2. Теперь они указывают на одни и те же данные и меняют одну другую. Чтобы создать глубокую копию, используйте функцию Clone(), например:

a2 = a1.Clone() as double[]; 
0

Это связано с тем, что статическая переменная хранится в куче. Когда вы назначаете a1 в a2, вы фактически указываете на одно и то же место в памяти, поэтому изменение в одном будет присутствовать как для a1, так и для a2.

Во втором случае эти переменные загружаются в стек и являются переменными типа значения. Следовательно, копируются только значения.

0

Назначив a2 = a1, вы не копируете массив a1 в a2. a1 и a2 представляют ссылки на объекты, поэтому, когда вы используете a2 = a1, вы копируете только ссылку (и поэтому a2 и a1 ссылаются на тот же объект, который является массивом {1,2,3,4,5}. Вот почему вы видим изменения, сделанные в а1 в а2 (так как они, по существу, то же самое)

Что вы хотите копировать поэлементно, что-то вроде этого:. https://msdn.microsoft.com/pl-pl/library/system.array.copy%28v=vs.110%29.aspx

Смежные вопросы