我对以下代码感到困惑:
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
}
}
答案 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受保护或公开)。