2010-04-05 2 views
0

В приложении C# Winforms (3.5) я добавил класс, который содержит много свойств (get/set), используемых для хранения значений из процесса длиной 12 форм.Удалить все значения свойств из объекта, связанного с формой Winforms?

После формы 12 Я хотел бы уничтожить все значения свойств в классе хранения, так что следующий пользователь не будет случайно записывать значения при запуске процесса в форме 1.

Можно ли удалить/уничтожить/распоряжаться всеми значениями свойств в классе?

Мой класс выглядит следующим образом:

private static int battery; 
public int Battery 
{ 
    get { return storeInspectionValues.battery; } 
    set { storeInspectionValues.battery = value; } 
} 
+4

Не будет ли новый пользователь имеет совершенно другой объект, который не имеет ничего общего с объектом предыдущего пользователя? –

+6

Почему аккумулятор статичен? – jjxtra

+0

Jeff/Kevin, Я предполагаю, что моя попытка - создать несколько квази-глобальных переменных, к которым можно получить доступ несколько раз. Мне придется посмотреть еще на хранение значений. –

ответ

16

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

Редактировать в ответ на комментарии:

Допустим, это ваш класс:

public class Foo 
{ 
    private int _battery; 
    private string _someOtherValue; 

    public int Battery 
    { 
     get { return _battery; } 
     set { _battery = value; } 
    } 

    public string SomeOtherValue 
    { 
     get { return _someOtherValue; } 
     set { _someOtherValue = value; } 
    } 
} 

Вы говорите, что вы хотите «стереть/уничтожить/утилизацию всех значений свойств в классе». Я предполагаю, что это означает, что вы хотели бы сбросить все свойства до значений по умолчанию. Это означает что-то вроде этого:

foo.Battery = 0; 
foo.SomeOtherValue = null; 

То же самое можно выполнить, делая это:

foo = new Foo(); 

Теперь foo является экземпляром, свойства которого имеют свои значения по умолчанию. Решает ли ваша проблема?

+3

Простой и эффективный. –

+1

Определенно; вместо того, чтобы использовать эффективную глобальную переменную, было бы намного проще и менее подвержено ошибкам просто передать состояние из формы в форму. – Aaronaught

+0

Aaronaught - Можете ли вы предоставить ссылку, которая более подробно объясняет, что вы описываете? Я изучаю как я иду, и ответ, предоставленный вами самим и Брайан Уоттс, не совсем ясен для меня. –

3

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

+1

Это будет похоже на метод Clear(), который может иметь старые структуры данных C++. – AaronLS

+0

Thanks Maurizio - Есть ли ссылки, которые могли бы объяснить ваши комментарии? –

0

Вы можете использовать using statement в цикле, чтобы ограничить область действия вашего объекта.

while (i_still_have_more_users_to_process) 
{ 
    using (MyObject myObject = new MyObject()) 
    { 
    // Do stuff with forms and myObject 
    } 
} 
+2

-1. Нет никаких признаков того, что класс реализует 'IDisposable', и даже если это так, это не гарантирует, что поля/свойства будут заданы по умолчанию. – Aaronaught

+0

Пожалуйста, помогите мне понять - создание нового объекта MyObject не приведет к тому, что поля/свойства этого объекта MyObject будут установлены в значения по умолчанию? Есть ли еще больше для вашего комментария, чем тот факт, что я мог бы каждый раз вводить новый объект в верхнюю часть цикла, а «использование» не нужно, потому что нет никаких доказательств того, что нужно утилизировать? – JeffH

1

Не существует встроенного механизма для «сброса» значений всех свойств класса. Хотя есть способы, которыми вы могли бы это сделать, как прямолинейные (создать метод, который явно сбрасывает все значения свойств), а не прямолинейно (используя Reflection, чтобы найти все свойства и установить их значения), я бы не рекомендовал ни один из этих подходы к тому, как это звучит, как вы пытаетесь достичь.

Если у вас есть пользовательский интерфейс, который захватывает данные, отправляя эти данные где-то, а затем отбрасывая их, то, скорее всего, вам захочется просто создать новый экземпляр вашего объекта, а не пытаться его очистить.

В вашем примере я заметил, что в вашем свойстве имеется опорная переменная, статическая. Если у вас нет особых причин для этого, вы, вероятно, должны сделать ваши переменные нестатичными, в противном случае создание нового экземпляра вашего объекта не будет действительно иметь желаемого эффекта (прочитайте разницу между статическими и нестатистическими переменными если это не имеет для вас смысла).

Добавлен следующий пример кода в ответ на комментарий:

Вы могли бы передать свой объект данных между формами в качестве аргумента конструктора или в качестве общественной собственности на каждой форме.Например, ваш код может выглядеть примерно так: каждая форма имеет кнопку «Далее», которая при нажатии закрывает текущую форму и открывает следующую форму, используя тот же объект данных. Объект MyDataClass передается каждой форме в качестве аргумента конструктора. Последняя форма не имеет кнопку «Next», но вместо этого есть кнопка «Сохранить», что, конечно, сохранить данные:

public partial class Form1 
{ 
    private MyDataClass _Data; 

    public Form1(MyDataClass data) 
    { 
     InitializeComponent(); 

     this._Data = data; 

     // TODO: initialize fields with values from this._Data 
    } 

    protected void btnNext_Click(object sender, EventArgs e) 
    { 
     // TODO: store field values to this._Data 

     // close this form 
     this.Close(); 

     // show the next form and pass the data object along to the next form 
     Form2 form = new Form2(this._Data); 
     form.Show(); 
    } 
} 

public partial class Form2 
{ 
    private MyDataClass _Data; 

    public Form2(MyDataClass data) 
    { 
     InitializeComponent(); 

     this._Data = data; 

     // TODO: initialize fields with values from this._Data 
    } 

    protected void btnNext_Click(object sender, EventArgs e) 
    { 
     // TODO: store field values to this._Data 

     // close this form 
     this.Close(); 

     // show the next form and pass the data object along to the next form 
     Form2 form = new Form2(this._Data); 
     form.Show(); 
    } 
} 

// ... 

public partial class Form12 
{ 
    private MyDataClass _Data; 

    public Form12(MyDataClass data) 
    { 
     InitializeComponent(); 

     this._Data = data; 

     // TODO: initialize fields with values from this._Data 
    } 

    protected void btnSave_Click(object sender, EventArgs e) 
    { 
     // TODO: store field values to this._Data 

     // TODO: save the data stored in this._Data, since this is the last form 

     // close this form 
     this.Close(); 
    } 
} 
+0

Dr. - Как ссылаться на класс без «нового» ключевого слова? –

+1

Джон, я не уверен, понимаю ли я то, о чем вы просите. Вы используете ключевое слово 'new' для создания экземпляра класса. Экземпляр класса имеет свои собственные переменные, которые отделены от других экземпляров одного и того же класса, поэтому, если вы создаете несколько экземпляров (один экземпляр при попытке пользователя заполнить формы в вашем примере), данные каждого экземпляра будут раздельными , Однако это не так, если переменные в вашем классе определены как «статические», что означает, что эта переменная фактически используется для всех экземпляров этого класса. Не уверен, что это поможет вам вообще. –

+0

Dr. - Я думаю, что неясно, можно ли инициализировать класс хранения, затем выполнить 12 различных форм - каждая форма, хранящаяся в этом экземпляре, - и затем записать значения экземпляра - а затем уничтожить/удалить экземпляр. –

1

Если вы абсолютно ДОЛЖНЫ использовать статические, а это означает, что при создании нового объекта не будет (поскольку они являются статическими), вы можете подумать:

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

Надеется, что это помогает

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