我知道我无法从实例对象
调用静态方法例如
public class A {
public static int a;
}
A b = new A();
b.a = 5; //which cannot compile
我想知道背后的原因。
答案 0 :(得分:8)
因为它毫无意义,并导致误导性代码。在阅读代码时,它会提供展示,a
是b
引用的实例的一部分。
例如,考虑:
ClassA a1 = new ClassA();
ClassA a2 = new ClassA();
a1.a = 10;
a2.a = 20;
Console.WriteLine(a1.a);
打印20而不是10,这将是非常奇怪的。
这在Java中是允许的,我已经看到它导致大量人们对以下事情感到困惑:
Thread t = new Thread(...);
t.start();
t.sleep(1000);
...这使得看起来就像你正在使新线程休眠一样,而实际Thread.sleep
是一个静态方法,它使现有线程休眠。
我很高兴在C#中不允许 。
答案 1 :(得分:0)
因为静态成员是类的一部分,但是实例成员与实例相关联,这就是为什么当你访问静态成员时应该通过类的名称访问它,这就是这背后的原因之一。