2013-07-12 3 views
2

У меня проблема при использовании статической переменной в моем проекте (силу с использованием статической переменной)Использование статической переменной в C#

public static List<int> a = new List<int>(); 
public static List<List<int>> list = new List<List<int>>(); 
public Form1() 
{ 
    for (int i = 0; i < 5;i++) 
     a.Add(i); 
    list.Add(a); 
    Console.WriteLine(list[0].Count); // **count = 5** 
    a.RemoveAt(0); 
    list.Add(a); 
    Console.WriteLine(list[0].Count); // **count = 4** 
    Console.WriteLine(list[1].Count); // count = 4 
} 

Когда я использую a.RemoveAt(0), это делает list[0] изменения. Почему он это делает и как я могу это исправить?

+1

потому что 'list [0]' содержит 'a', поэтому если вы удалите sth из' a' 'list [0] .Count' отличается. Это не из-за статики, потому что 'list [0]' содержит ссылку на объект 'a' – wudzik

+2

Ну да, вы имеете в виду один и тот же объект. Если вы хотите сохранить _copy_ 'a' в' list [0] ', тогда сделайте копию:' list.Add (a.ToList()); '(обязательно добавьте директиву' using System.Linq; ') –

+1

, что вы пытаетесь архивировать с помощью этого кода? –

ответ

1

В списке содержится ссылка на a, поэтому, если вы измените объект a, тогда список count также изменится, поскольку он относится к одной и той же вещи.

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

Пример:

list.Add(a.ToList()); // See Chris Sinclair's example, full credit to him 
+0

Это фактически не делает копию 'a'; он _again_ указывает на ту же ссылку. –

+1

Это правда. Тем не менее я не комментировал/ниспровергал. – Sandy

+0

Вы правы Извиняюсь, я обновил ссылку на ваш ответ – Serberuss

5

Ну да, вы имеете в виду тот же объект, поскольку List<T> является ссылочного типа. См: http://msdn.microsoft.com/en-us/library/s6938f28.aspx

Например:

List<int> a = new List<int>(); 
List<int> b = a; 
Console.WriteLine(Object.ReferenceEquals(a, b)); //true 

a.Add(1); 
Console.WriteLine(a[0]); //1 
Console.WriteLine(b[0]); //1 

a[0] = 9000; 
Console.WriteLine(a[0]); //9000 
Console.WriteLine(b[0]); //9000 

Сохранение списка в списке даст тот же результат: вы указывая на тот же исходный список.

Если вы хотите сохранить копию из a в list[0], сделайте копию:

list.Add(new List<int>(a)); 

Или использовать LINQ, чтобы сделать его более лаконичным:

list.Add(a.ToList()); 

(убедитесь, что в добавьте директиву using System.Linq; в начало вашего файла кода)

0

вам необходимо сделать копию lis t (поскольку список содержит + ссылку на a):

 public static List<int> a = new List<int>(); 
     public static List<List<int>> list = new List<List<int>>(); 

     for (int i = 0; i < 5; i++) 
      a.Add(i); 
     list.Add(a.Select(i => i).ToList());//passed in a copy of a. 
     Console.WriteLine(list[0].Count); // **count = 5** 
     a.RemoveAt(0); 
     list.Add(a); 
     Console.WriteLine(list[0].Count); // **count = 5** 
     Console.WriteLine(list[1].Count); // count = 4 
2

Вы должны понимать это из основ. Lists объекты работают через ссылку. Когда вы добавили объект a в list, это означает, что вы добавили ссылку a в list. Теперь, что бы вы ни изменили в a, что будет отражено в list[0], так как это относится к той же ссылке.

Для этого вы можете сделать это.

 var masterList = new List<List<int>>(); 

     var l1 = new List<int>{1, 2, 3, 4, 5}; // Reference created for l1 
     var l2 = new List<int>(); // Reference created for l2 

     masterList.Add(l1); // l1 reference added to masterList 
     masterList.Add(l2); // l2 reference added to masterList 

     l2.AddRange(l1); // This will copy values from l1 reference to l2 reference and will not touch the references 

     l2.RemoveAt(0); // First value removed from reference l2 (And therefore it should not affect reference l1) 

     MessageBox.Show(masterList[0].Count.ToString() + " and " + masterList[1].Count.ToString()); 

Это должно помочь вам понять, что происходит здесь. Вы также должны помнить, что НИЧЕГО не имеет значения со статическими переменными, как указывает заголовок вопроса.

Надеюсь, это поможет.

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