每次访问成员时都会执行以下代码吗?

时间:2012-10-22 07:10:12

标签: c# singleton mef

我在类库中有以下代码:

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;

2 个答案:

答案 0 :(得分:3)

目录扫描仅在实例构造函数中发生。实例构造函数仅在使用new Manager()时(假设没有人使用反射作弊),在静态字段初始化程序中只发生一次。

所以:不。它应该只发生一次 - 每个app-domain第一次。

然而,你可以坚持一个断点/某种输出,然后找出......

答案 1 :(得分:1)

当您第一次访问Manager (它的实例或其静态方法和字段)时,Manager的静态构造函数将运行,初始化instance字段 因此,下次访问instance字段时,系统会对其进行初始化,但不会运行new Manager()

实际上,C#编译器会自动将字段初始化移动到类构造函数。以下代码

private static readonly Manager instance = new Manager();

将转换为:

private static readonly Manager instance;
static Manager()
{
    instance = new Manager();
}