Скажите пожалуйста чем отличается:
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){
}
Скажите в чем отличие и что лучше(если есть разница)?
Вопрос был отредактирован до такой степени, что полностью изменился в сравнении с первоначальным. Отвечу на текущую версию.
Создадим такой класс:
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
.
Первый вариант хуже тем, что не скомпилируется.
А второй - хуже тем, что нестатический член класса недоступен в статическом методе по той же причине, по которой первый фрагмент не скомпилируется, - если Вы планировали использовать а
в Main
.
Update
Отличие в том, что в первом случае а
член класса формы, а во втором - локальная переменная в методе Form_Load
. Что лучше - зависит от того, как Вы собираетесь ее использовать.
Тут слово "лучше" не совсем уместно. Если а
нужен только внутри Form_Load
, то он там и должен быть и объявлен и создан. Если он используется в нескольких методах, то объявлен он должен быть как член класса (вне метода), а создан - когда есть все, что нужно для его создания.
Виртуальный выделенный сервер (VDS) становится отличным выбором
В приложении WPF есть необходимость открыть файл с расширением exe в фоновом режимеОткрыл диспетчер задач во время нажатия кнопки, crypto_parser
Может быть вы можете помочь или натолкнуть на правильное понимание вопроса