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();}}}