Удалить все значения свойств из объекта, привязанного к форме Winforms? - PullRequest
0 голосов
/ 06 апреля 2010

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

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

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

Мой класс выглядит так:

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

Ответы [ 5 ]

16 голосов
/ 06 апреля 2010

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

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

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

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 голосов
/ 06 апреля 2010

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

1 голос
/ 06 апреля 2010

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

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

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

1 голос
/ 06 апреля 2010

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

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

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

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

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

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 голосов
/ 06 апреля 2010

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

while (i_still_have_more_users_to_process)
{
    using (MyObject myObject = new MyObject())
    {
    // Do stuff with forms and myObject
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...