Считается, что в статических методах нельзя работать с нестатическими членами класса. Однако это не совсем так.
Из статических методов невозможен прямой доступ к нестатическим членам, так как они существуют только в экземпляре класса. В тоже время, если передать в статический метод сам существующий экземпляр данного класса, можно беспрепятственно обратиться даже к его закрытым (private) полям, свойствам и методам.
Допустим, существует класс некоторой формы, у которой есть нестатическое поле label1 и статический метод MyStaticMethod. Если из этого метода обратиться к label1, как показано ниже, компилятор выдаст ошибку.
1 2 3 4 |
private static void MyStaticMethod() { label1.Text = "Текст заданный в статическом методе"; } |
Однако если в MyStaticMethod передать экземпляр формы и обратиться к label1, как к её полю никаких ошибок не возникнет.
1 2 3 4 |
private static void MyStaticMethod(Form1 f1) { f1.label1.Text = "Текст заданный в статическом методе"; } |
Более того, при вызове данного метода, например, из другого, нестатического, метода того же класса он будет прекрасно работать.
1 2 3 4 |
private void button1_Click(object sender, EventArgs e) { MyStaticMethod(this); } |
Описанный способ имеет естественные ограничения.
- Необходимо существование хотя бы одного экземпляра данного класса.
- Если статический метод работающий с нестатическими членами вызывается из другого статического метода того же класса, то последний также должен принимать его экземпляр для последующей передачи в первый метод.
Эти обстоятельства следует обязательно иметь в виду. Иначе при работе программы не избежать критических ошибок.
Добавить комментарий