1

私はこのようなセットアップでコードに遭遇しました:

internal class Something
{
    public string Name { get; set; }

    public override string ToString()
    {
        return Name;
    }
}

internal static class Factory
{
    public static string Name { get; set; }

    public static Something Create()
    {
        return new Something { Name = Name };
    }
}

internal static class Resources
{
    public static readonly Something DefaultSomething = Factory.Create();
}

internal class Program
{
    public static void Main(string[] args)
    {
        Factory.Name = "MyFactory";
        Execute();
        Console.ReadKey();
    }

    private static void Execute()
    {
        Console.WriteLine(Resources.DefaultSomething);
    }
}

もちろん、これは単なる抜粋であり、なぜこれがこのように行われるのかについては詳しく説明しません。

これに関する私の問題は、デバッグで実行しているときとデバッガなしでリリースしているときの動作の違いです。

  • デバッガーによるデバッグまたはリリース:MyFactoryコンソールに出力されます
  • デバッガなしでリリース:空の行が出力されます

明らかに、問題は静的要素の初期化の実行順序と、リリースモードでのコンパイル中に実行されるいくつかの最適化にあります。このセットアップにブレーキをかけずにこれを修正する方法を知りたいです。

4

1 に答える 1

5

修正は、静的コンストラクターをResourcesクラスに追加することです。

internal static class Resources
{
    public static readonly Something DefaultSomething = Factory.Create();

    static Resources()
    {
    }
}

編集JonSkeetによるこの記事を読む

于 2012-07-26T08:37:18.510 に答える