我知道我们可以使用像这样的类名来访问静态成员
Myclass.MyStaticMember
并且无需初始化
但我的问题是为什么我们无法从初始化对象
访问静态成员Myclass.MyStaticMember obj =new Myclass.MyStaticMember()
obj.MyStaticMember
是通过CLR
或.net框架架构或编译器
答案 0 :(得分:7)
这是一种语言决定,可以让您的代码更清晰。 (对于C#编译器来说,根据变量的编译时类型将代码编译成静态访问,这完全是 possible 。)如果你写的话:
obj.StaticMember
看起来就像该成员特定于obj
- 但事实并非如此。代码不应该说谎。
作为一个令人困惑的例子,请考虑以下有效的Java代码(假设Runnable
变量名为runnable
):
Thread thread = new Thread(runnable);
thread.start();
thread.sleep(1000);
哪个线程会发送到睡眠状态?新的,当然 - 看,它在引用新线程的变量上调用sleep()
。除了当然Thread.sleep
是一个静态方法,总是使当前正在执行的线程休眠。从上面的代码中可以明显看出 。幸运的是,它在C#中无效。
这是C#团队显然从Java的错误中学习的一个领域,我很高兴。 (关于其他一些方面的耻辱,但嘿......)
答案 1 :(得分:1)
静态成员“不属于”Type T
的任何给定实例 - 在某种意义上它属于类型本身。
实际的“值”与CLR详细信息中相应的EEClass
内部相关联,这些内容在该类型的所有实例中共享。