Чем отличается что лучше использовать?

178
21 ноября 2018, 00:30

Скажите пожалуйста чем отличается:

Class a;
private void Form_Load(object sender, System.EventArgs e){
   a = new Class(args);
} 

От:

Class a = new Class(args);
private void Form_Load(object sender, System.EventArgs e){
}

Скажите в чем отличие и что лучше(если есть разница)?

Answer 1

Вопрос был отредактирован до такой степени, что полностью изменился в сравнении с первоначальным. Отвечу на текущую версию.

Создадим такой класс:

public class ClassA
{
    public ClassA()
    {
        MessageBox.Show("A");
    }
}

В классе формы напишем следующее:

public partial class Form1 : Form
{
    ClassA a = new ClassA();
    public Form1()
    {
        MessageBox.Show("Begin");
        InitializeComponent();
        MessageBox.Show("End");
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        MessageBox.Show("Load");
    }
}

Если теперь запустить приложение, то сообщения выведутся в следующем порядке:

A
Begin
End
Load

Как можно видеть, создание экземпляра ClassA было осуществлено в самом начале конструктора формы.

Вообще, выполнить код вне какого-либо метода или свойства невозможно. Дело в том, что компилятор переносит код задания полей класса, наподобие показанного выше, в конструкторы этого класса (причём во все - это важно!).

То есть, вот такой код:

public partial class Form1 : Form
{
    ClassA a = new ClassA();
    ClassB b = new ClassB();
    ClassC c = new ClassC();
    public Form1()
    {            
        InitializeComponent();
    }
    public Form1(object someObject)
    {
        InitializeComponent();
    }
}

на этапе компиляции будет преобразован в такой:

public partial class Form1 : Form
{
    ClassA a;
    ClassB b;
    ClassC c;
    public Form1()
    {
        a = new ClassA();
        b = new ClassB();
        c = new ClassC();
        InitializeComponent();
    }
    public Form1(object someObject)
    {
        a = new ClassA();
        b = new ClassB();
        c = new ClassC();
        InitializeComponent();
    }
}

В итоге код распухает. Поэтому обычно рекомендуется задавать значения полям класса в одном конструкторе и вызывать этот конструктор из других. Приводить код не буду, итак ответ слишком громоздок. Читайте Рихтера.

Так как такой вариант кода выполняется в самом начале конструктора, понятно, что в этот момент сама форма ещё не создана, не существует ещё ни одного контрола на ней. Поэтому код может упасть, если классы ClassA, ClassB, и т. д. обращаются к каким-либо членам формы.

Отсюда становится понятно, что код, который должен обращаться к уже инициализированной форме, нужно помещать в событие Form.Load.

Answer 2

Первый вариант хуже тем, что не скомпилируется.

А второй - хуже тем, что нестатический член класса недоступен в статическом методе по той же причине, по которой первый фрагмент не скомпилируется, - если Вы планировали использовать а в Main.

Update

Отличие в том, что в первом случае а член класса формы, а во втором - локальная переменная в методе Form_Load. Что лучше - зависит от того, как Вы собираетесь ее использовать.

Тут слово "лучше" не совсем уместно. Если а нужен только внутри Form_Load, то он там и должен быть и объявлен и создан. Если он используется в нескольких методах, то объявлен он должен быть как член класса (вне метода), а создан - когда есть все, что нужно для его создания.

READ ALSO
Не запускается файл .exe

Не запускается файл .exe

В приложении WPF есть необходимость открыть файл с расширением exe в фоновом режимеОткрыл диспетчер задач во время нажатия кнопки, crypto_parser

187
Оптимизация c# кода

Оптимизация c# кода

Как можно оптимизировать этот код?

162
Имитация файла в потоке из строки

Имитация файла в потоке из строки

Может быть вы можете помочь или натолкнуть на правильное понимание вопроса

158