2

我知道我们可以使用这样的类名访问静态成员

Myclass.MyStaticMember

并且不需要初始化它

但我的问题是为什么我们不能从初始化对象访问静态成员

Myclass.MyStaticMember obj =new  Myclass.MyStaticMember()
obj.MyStaticMember

是否有相关的 viaCLR或 .net 框架架构或编译器

4

2 回答 2

7

这是一个语言决定,让你的代码更清晰。(对于 C# 编译器来说,根据变量的编译时类型将代码编译成静态访问是完全可行的。)如果你写:

obj.StaticMember

看起来成员特定于obj- 但事实并非如此。代码不应该撒谎。

举例说明这可能会造成多大的混乱,请考虑以下有效的 Java 代码(假设有一个Runnable名为 的变量runnable):

Thread thread = new Thread(runnable);
thread.start();
thread.sleep(1000);

哪个线程进入睡眠状态?当然是新的 - 看,它正在调用sleep()引用新线程的变量。当然除了Thread.sleep是一个静态方法,它总是使当前执行的线程休眠。这一点从上面的代码中并不明显。幸运的是,它在 C# 中无效。

这是 C# 团队显然从 Java 的错误中吸取教训的一个领域,对此我感到非常高兴。(对其他一些方面感到羞耻,但是嘿......)

于 2013-03-01T18:32:39.140 回答
1

静态成员“不属于”任何给定的 a 实例——在某种意义上,Type T它属于类型本身。

实际的“值”与 CLR 详细信息中的相应EEClass深层相关联,该详细信息在该类型的所有实例之间共享。

于 2013-03-01T18:34:18.807 回答