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

Ada*_*Lee 1 c#

我知道我不能从实例对象中调用静态方法

例如

public class A {
  public static int a;
}

A b = new A();
b.a = 5; //which cannot compile
Run Code Online (Sandbox Code Playgroud)

我想知道背后的原因.

Jon*_*eet 8

因为它毫无意义,并导致误导性代码.当读取代码,它给人的印象a是部分实例提到了b.

例如,考虑:

ClassA a1 = new ClassA();
ClassA a2 = new ClassA();

a1.a = 10;
a2.a = 20;
Console.WriteLine(a1.a);
Run Code Online (Sandbox Code Playgroud)

打印20而不是10,这将是非常奇怪的.

这在Java中是允许的,我已经看到它导致大量人们对以下事情感到困惑:

Thread t = new Thread(...);
t.start();
t.sleep(1000);
Run Code Online (Sandbox Code Playgroud)

...这使得它看起来像你正在使新线程休眠,而实际上Thread.sleep是一个静态方法,使现有线程睡眠.

我很高兴在C#中不允许这样.