Как нестатический доступен в статическом контексте в этой программе? - PullRequest
0 голосов
/ 15 ноября 2010

У меня путаница со следующим кодом:

    class A
    {
     int x;
     static void F(B b) {
      b.x = 1;  /* Ok, 
I want to know how is this ok, in a static block how a non static 
instance variables are called because as I know that static block 
gets memory at compile time before execution of a single command 
while non static at run time and static method accessing a non static 
variable which is not created yet please elaborate me on this
*/    
     }
    }
    class B: A
    {
     static void F(B b) {
      b.x = 1;  // Error, x not accessible
     }
    }

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

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

Теперь, почему статические методы не имеют доступа к полям экземпляра.Учтите это:

class A {
    public int Value;

    static int GetValue() {
        return Value;
    }
}

Там у вас есть класс с полем экземпляра и статическим методом.Теперь, где-то еще вы попробуете это:

var a1 = new A();
a1.Value = 5;

var a2 = new A();
a2.Value = 10;

int result = A.GetValue();

Теперь, если компилятор это допустит, какое значение получит результат?5 или 10 или что-то еще?Это просто не имеет смысла, потому что статические методы объявлены для класса в целом и не знают экземпляров этого класса.Таким образом, в коде статического метода вы не знаете, сколько (если таковые имеются) экземпляры этого класса существуют и не можете получить доступ к их полям экземпляров.

Надеюсь, это имеет смысл.

1 голос
/ 15 ноября 2010

Либо вы немного изменили код, либо я не очень внимательно прочитал.Кажется, сейчас это совсем другая проблема.Переменная x действительно недоступна для класса B из-за ее уровня защиты (по умолчанию в C # это private).Класс A может изменять X, потому что он объявлен в классе A и видим для его метода.Класс B не может этого сделать (для этого вы должны сделать x защищенным или публичным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...