为什么我们无法从实例对象访问静态成员?

时间:2015-03-22 09:37:25

标签: c#

我知道我无法从实例对象

调用静态方法

例如

public class A {
  public static int a;
}

A b = new A();
b.a = 5; //which cannot compile

我想知道背后的原因。

2 个答案:

答案 0 :(得分:8)

因为它毫无意义,并导致误导性代码。在阅读代码时,它会提供展示ab引用的实例的一部分。

例如,考虑:

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)

因为静态成员是类的一部分,但是实例成员与实例相关联,这就是为什么当你访问静态成员时应该通过类的名称访问它,这就是这背后的原因之一。