2

クラス ライブラリに次のコードがあります。

public class Manager
{
    private static readonly Manager instance = new Manager();

    public static IHelper Helper { get { return Manager.instance.helper; } }

    [Import(typeof(IHelper))]
    internal IHelper helper { get; set; }

    private Manager()
    {
        using (DirectoryCatalog catalog =new DirectoryCatalog(@"c:\Dev\Plugins"))
        {
            CompositionContainer container = new CompositionContainer(catalog);
            container.ComposeParts(this);
        }
    }
}

上記のクラスを使用して、実行時にカスタムのユーザー インターフェイス設定を設定しています。コンストラクターは、メンバーにアクセスするたびに実行されますか (ディレクトリをスキャンしますか)?

呼び出しの例は次のとおりです。lblMask.Text = Helper.SearchMask;

4

2 に答える 2

3

ディレクトリのスキャンは、インスタンス コンストラクターでのみ発生します。インスタンスコンストラクターnew Manager()は、静的フィールド初期化子で が使用された場合にのみ発生します (誰もリフレクションでチートしないと仮定します)。これは一度だけ発生します。

だから:いいえ。これは、アプリ ドメインごとに 1 回だけ発生する必要があります。

ただし、ブレークポイント/何らかの出力に固執して、調べることができます...

于 2012-10-22T07:13:05.787 に答える
1

初めてManagerクラスにアクセスすると(クラスのインスタンスまたはその静的メソッドとフィールドのいずれか)、の静的コンストラクターが実行され、フィールドが初期化されます。 そのため、次にフィールドにアクセスすると、フィールドは初期化されて実行されません。Managerinstance
instancenew Manager()

実際、C# コンパイラは、フィールドの初期化をクラス コンストラクターに自動的に移動します。次のコード

private static readonly Manager instance = new Manager();

これに変換されます:

private static readonly Manager instance;
static Manager()
{
    instance = new Manager();
}
于 2012-10-22T08:13:36.013 に答える