2012-10-22 65 views
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;

+1

當你不知道,如果調用構造函數,可以輸出一個字符串來測試:) – alestanis

+0

@alestanis - 好想法:) – Xaisoft

回答

3

目錄掃描只發生在實例構造函數。實例構造函數僅在使用new Manager()(假設沒有人使用反射作弊)時纔會發生,只有一次發生在靜態字段初始值設定項中。

所以:沒有。它應該只發生一次 - 每個應用程序域的第一次。

但是,你可以只貼在斷點/某種輸出,並找出...

+0

我還是有點困惑。這是我的想法。當我調用像'Helper.SearchMask'這樣的函數時,我想它會訪問將要執行'new Manager'的'Manager.instance.helper'。我覺得我在理解實例的順序時遇到了困難,在這種情況下,靜態如何在這種情況下運行 – Xaisoft

+0

@ Xaisoft如果您希望代碼每次都可以將實例從成員更改爲屬性時運行。 '公共靜態管理器實例{get {return new Manager(); }} – Tobsey

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(); 
} 
相關問題