2013-11-17 3 views
1

Я действительно смущен и надеюсь, что кто-то сможет помочь мне в проблеме, которую я испытываю. Я хочу использовать команду GET для получения значения из новой формы, но мой код перезаписывает параметры, которые я передаю в конструкторе, и я не уверен, почему. Не очень хорошо знаком с C#.Перепутанная переменная перезаписывается

Здесь сценарий, который я использую, когда я нажимаю на определенную кнопку. Это новая форма, где я прохожу в параметры список интерфейсов (параметры будут изменены, и я не хочу):

private void btn_t1_Click(object sender, EventArgs e) { 
    InterfaceT1 Formulaire_T1 = new InterfaceT1(**this.Liste_T1**); 

    if (Formulaire_T1.ShowDialog() == DialogResult.OK) { 
     //I WOULD WANT TO USE THE GET COMMAND HERE ONLY IF I CLICK 'OK' ON THE FORM 
    } 

    Formulaire_T1.Dispose(); 
} 

Вот конструктор моей формы Formulaire_T1 для справки:

public InterfaceT1(List<T1> Liste_T1) { 
     InitializeComponent(); 
     this.Liste_T1s = new List<T1>(Liste_T1); //suggested, does not change anything 
     UpdateView(0); 
    } 

Методы, которые я использую в Interface_T1, изменяют Liste_T1s, но почему он также меняет Liste_T1 в основной функции? Я не возвращаю никакой ценности. Кажется, эта ценность теперь связана? Я знаю, что это должно быть просто, но не понять.

+0

Если я правильно понимаю вашу проблему, похоже, что вы ссылаетесь на один и тот же список в нескольких местах. Из-за этого изменение списка в одном месте будет видно и для другой ссылки. См. Здесь: http://stackoverflow.com/questions/13977841/how-do-i-change-my-new-list-without-changing-the-original-list EDIT: Хм, это не самый большой вопрос, который я связал с , но ответы ниже описывают это. –

+3

Что такое «команда GET»? –

+2

Не указывайте свои формы 'Интерфейс'. Это действительно сбивает с толку. –

ответ

3

Причина, по которой ваш метод в InterfaceT1 изменяет список, который вы передаете, заключается в том, что конструктор сохраняет ссылку на список, а не копирует его. Измените конструктор следующим образом, чтобы это исправить:

public InterfaceT1(List<T1> Liste_T1) { 
    InitializeComponent(); 
    this.Liste_T1s = new List<T1>(Liste_T1); // Make a copy 
    UpdateView(0); 
} 

Обратите внимание, что это изменение будет сделать копию самого списка, а не его элементы: они остаются теми же. Добавление/удаление элементов из скопированного списка будет ОК, но в оригинале будет видно, что отдельные элементы будут видны. Чтобы преодолеть эту проблему, измените код следующим образом:

public InterfaceT1(List<T1> Liste_T1) { 
    InitializeComponent(); 
    this.Liste_T1s = Liste_T1.Select(t => new T1(t)).ToList(); 
    UpdateView(0); 
} 

В коде выше я предполагаю, что новый экземпляр T1 может быть создан вызовом «копировать» конструктор, который принимает другой экземпляр T1 и копии его полей.

+0

Хорошо, я думаю, я понимаю! Я должен скопировать список вместо того, чтобы передавать его в параметры, поэтому он будет другим ссылочным типом. Но ваше решение не работает. Есть ли другой способ скопировать список? –

+1

@JulieDupont «Не работает» плохо информирует о вашей проблеме. –

+0

Такая же проблема. Опять переписывание, поэтому я думаю, что это не совсем копия. –

2

List является ссылочный тип. Это означает, что если вы передадите его в качестве параметра в другой метод, вы не передадите копию списка, вы передадите ссылку, которая указывает на исходный список.

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