Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每次我访问一个成员时是否都会执行以下代码?_C#_Singleton_Mef - Fatal编程技术网

C# 每次我访问一个成员时是否都会执行以下代码?

C# 每次我访问一个成员时是否都会执行以下代码?,c#,singleton,mef,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; }

我在类库中有以下代码:

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

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

所以:不。它应该只发生一次——每个应用程序域都是第一次


但是,您可以只插入一个断点/某种输出,然后发现…

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

所以:不。它应该只发生一次——每个应用程序域都是第一次


但是,当您第一次访问
管理器
(它的一个实例或它的静态方法和字段)时,
管理器
的静态构造函数将运行并初始化
实例
字段。
因此,下次访问
实例
字段时,它将被初始化,并且不会运行
new Manager()

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

private static readonly Manager instance = new Manager();
将转换为:

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

当您第一次访问
管理器
(它的实例或其静态方法和字段)时,
管理器
的静态构造函数将运行并初始化
实例
字段。
因此,下次访问
实例
字段时,它将被初始化,并且不会运行
new Manager()

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

private static readonly Manager instance = new Manager();
将转换为:

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

当你不知道构造函数是否被调用时,你可以从中输出一个字符串来测试:)当你不知道构造函数是否被调用时,你可以从中输出一个字符串来测试:)我还是有点困惑。这是我的想法。当我调用类似于
Helper.SearchMask
的东西时,我认为它将访问
Manager.instance.Helper
,这将执行
newmanager
。我想我很难理解这里的实例化顺序,静态是如何在这里工作的scenario@Xaisoft如果希望每次运行代码,可以将实例从成员更改为属性<代码>公共静态管理器实例{get{return new Manager();}}}
我仍然有点困惑。这是我的想法。当我调用类似于
Helper.SearchMask
的东西时,我认为它将访问
Manager.instance.Helper
,这将执行
newmanager
。我想我很难理解这里的实例化顺序,静态是如何在这里工作的scenario@Xaisoft如果希望每次运行代码,可以将实例从成员更改为属性<代码>公共静态管理器实例{get{return new Manager();}}}