为什么C#中的命令对静态初始化很重要?

BCS*_*BCS 8 c# language-theory

此代码在C#中具有明确定义的行为:

class Foo
{
    static List<int> to = new List<int>( from ); // from is still null
    static IEnumerable<int> from = Something();
}
Run Code Online (Sandbox Code Playgroud)

注意:我不是问如何修复该代码,因为我已经知道如何做到这一点

这有什么理由?C#已经进行了运行时检查,以检测对静态成员的第一次访问.为什么不将它扩展到每个成员的东西并让它们按需运行,甚至更好的让编译器在编译时弄清楚顺序?

顺便说一句:我认为同样的问题(或几乎相同)也适用于非静态成员.

Krz*_*mic 12

初始化器只是一种语法糖.编译器在编译类时将代码放在.cctor中,并将它们放在代码中放置的命令中.

它没有运行任何检查,因为它没有意义.你仍然可以有初始化周期,所以它无论如何都不会工作.

如果您有兴趣,我前一段时间在博客上写道:


Jim*_*hel 6

由于与其他静态类的副作用,我可以设想一个程序员取决于初始化顺序.你和我都知道,根据副作用是不好的做法,但它不一定是非法的.

考虑这样的事情:

class Foo
{
    static string header = Bar.GetHeader();
    static string version = Bar.GetVersion();
}
Run Code Online (Sandbox Code Playgroud)

Bar.GetVersion假设Bar.GetHeader已被召唤.如果编译器可以自由更改初始化顺序,那么程序员将无法保证初始化顺序.

丑陋,被授予,但完全合法.如果您想象二阶效应(即称为静态方法本身依赖于具有副作用的类),您会发现编译器无法可靠地重新排列任何内容,就像编译器重新排列一样不可能(通常)静态构造函数中函数调用的顺序.