访问静态成员

时间:2013-03-01 18:29:57

标签: c#

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

Myclass.MyStaticMember

并且无需初始化

但我的问题是为什么我们无法从初始化对象

访问静态成员
Myclass.MyStaticMember obj =new  Myclass.MyStaticMember()
obj.MyStaticMember

是通过CLR或.net框架架构或编译器

相关的

2 个答案:

答案 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内部相关联,这些内容在该类型的所有实例中共享。