如何在此程序中的静态上下文中访问非静态?

时间:2010-11-15 07:32:35

标签: c#-3.0

我对以下代码感到困惑:

    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 个答案:

答案 0 :(得分:2)

在编译时没有任何内存。当类型初始化时,静态字段确实放在静态内存块中。静态方法的调用堆栈在运行时分配,与实例方法完全相同。

现在,为什么静态方法无法访问实例字段。考虑一下:

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 :(得分:1)

您要么稍微更改了有问题的代码,要么我没有仔细阅读。现在似乎是完全不同的问题。由于其保护级别(C#中的默认值是私有的),因此B类确实无法访问变量x。 A类可以修改X,因为它在A类中声明并且对其方法可见。 B类不能这样做(你必须使x受保护或公开)。