我知道我们可以使用这样的类名访问静态成员
Myclass.MyStaticMember
并且不需要初始化它
但我的问题是为什么我们不能从初始化对象访问静态成员
Myclass.MyStaticMember obj =new Myclass.MyStaticMember()
obj.MyStaticMember
是否有相关的 viaCLR
或 .net 框架架构或编译器
我知道我们可以使用这样的类名访问静态成员
Myclass.MyStaticMember
并且不需要初始化它
但我的问题是为什么我们不能从初始化对象访问静态成员
Myclass.MyStaticMember obj =new Myclass.MyStaticMember()
obj.MyStaticMember
是否有相关的 viaCLR
或 .net 框架架构或编译器
这是一个语言决定,让你的代码更清晰。(对于 C# 编译器来说,根据变量的编译时类型将代码编译成静态访问是完全可行的。)如果你写:
obj.StaticMember
看起来该成员特定于obj
- 但事实并非如此。代码不应该撒谎。
举例说明这可能会造成多大的混乱,请考虑以下有效的 Java 代码(假设有一个Runnable
名为 的变量runnable
):
Thread thread = new Thread(runnable);
thread.start();
thread.sleep(1000);
哪个线程进入睡眠状态?当然是新的 - 看,它正在调用sleep()
引用新线程的变量。当然除了Thread.sleep
是一个静态方法,它总是使当前执行的线程休眠。这一点从上面的代码中并不明显。幸运的是,它在 C# 中无效。
这是 C# 团队显然从 Java 的错误中吸取教训的一个领域,对此我感到非常高兴。(对其他一些方面感到羞耻,但是嘿......)
静态成员“不属于”任何给定的 a 实例——在某种意义上,Type T
它属于类型本身。
实际的“值”与 CLR 详细信息中的相应EEClass
深层相关联,该详细信息在该类型的所有实例之间共享。