C# 访问静态成员

C# 访问静态成员,c#,C#,我知道我们可以用这样的类名访问静态成员 Myclass.MyStaticMember 不需要初始化这个 但我的问题是为什么我们不能从初始化对象访问静态成员 Myclass.MyStaticMember obj =new Myclass.MyStaticMember() obj.MyStaticMember 是否通过CLR或.net framework体系结构或编译器进行相关操作这是一个语言决定,以使代码更清晰。(对于C#编译器来说,根据变量的编译时类型将代码编译成静态访问是完全可行的。)如

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

Myclass.MyStaticMember
不需要初始化这个

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

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

是否通过
CLR
或.net framework体系结构或编译器进行相关操作

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

obj.StaticMember
看起来该成员特定于
obj
——但事实并非如此。代码不应该说谎

作为一个混淆的例子,考虑下面的有效java代码(假设<代码> Runnaby<代码>变量>代码> Runnaby<代码>:

哪个线程发送到睡眠状态?当然是新的一个-看,它正在对引用新线程的变量调用
sleep()
。当然除了
线程之外。sleep
是一个静态方法,它总是使当前执行的线程处于睡眠状态。从上面的代码来看,这一点都不明显。幸运的是,它在C#中无效

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

静态成员“不属于”任何给定的
类型T的实例-从某种意义上说,它属于类型本身


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

静态成员变量不能是对象实例的成员。它在对象的所有实例中共享。+1用于描述为什么通常采用这种方式,因为它同样适用于所有语言。@ShahroozJefri:详细阅读规范。它写得很好。@JonSkeet你有什么资源吗?我爱c#,我想和你一样学习。谢谢你的帮助
Thread thread = new Thread(runnable);
thread.start();
thread.sleep(1000);