2012-11-26 33 views
4

我想清理我的代碼初始化靜態只讀變量。如何使用匿名方法初始化靜態只讀變量?

原文:

public static readonly List<int> MyList; 

//Initialize MyList in the static constructor 
static MyObject() { ... } 


我決定把它清理乾淨,因爲CodeAnalysis說我不應該使用靜態構造函數(CA1810)。

清理:

public static readonly List<int> MyList = GetMyList(); 

//Returns the list 
private static List<int> GetMyList() { ... } 


我真的不喜歡的另一種方法,所以我想我會設法得到它是所有內聯,但它不會工作。我不知道我在做什麼錯在這裏...

public static readonly List<int> MyList = 
    () => 
     { 
      ... 

      return list; 
     }; 

我試圖採取GetMyList()方法中的代碼,並將其放置在一個匿名委託返回列表中指定,但它說我試圖將delegate轉換爲List<int>

回答

4

這看起來有點怪異,但試試這個:

public static readonly List<int> MyList = new Func<List<int>>(
() => 
{ 
    // Create your list here 
    return new List<int>(); 
})(); 

訣竅是創建一個新的Func<List<int>>並調用它。

+0

這很奇怪,也許最好是用標準方法保存它呢? – michael

+0

@michael也許 - 取決於你認爲更可讀和可維護的內容。這些值是不變的?你可以使用公共靜態只讀列表 MyList =新列表 {1,2,3};'? –

+0

不,比它更多,否則內聯就會超級容易。 – michael

1

它說得對。 () => ...返回一個委託。但是你需要一個列表。出於這個原因,您必須致電此代表並獲得結果。

4

的原因是,當你寫

() => 
    { 
     ... 

     return list; 
    }; 

你實際上是在宣告一個委託 - 返回List<int>的功能,但是你沒有實際調用該函數,因此,這種計算結果爲Func<List<int>>,而不是到List<int>

我不是很確定你爲什麼要刪除你的靜態構造函數。靜態構造函數具有它們的用途,並且在某些情況下甚至可以使代碼更清晰並更具可讀性。

+0

+1。是的,爲了得到結果,需要調用函數...我也更喜歡單獨的函數。 「iffe」在JavaScript中看起來更自然:) –

2

它說我試圖委託轉換爲List<int>

那是因爲你。請記住,定義lambda與調用lambda不同。你不得不做更多的東西是這樣的:

Func<List<int>> createList =() => { ... return list; }; 
MyList = createList(); 
2

您應該立即調用它使它成爲一個列表:

public static readonly List<int> MyList = new Func<List<int>>(() => { 
    return new List<int>(); 
})(); //<-- the parentheses that invoke 

的語法在C#中是這樣前途未卜,它可能是最好去與不同的調用或方法。

0

正如很多人所說的,普通() => { ... }返回委託或表達式。我認爲創建一個單獨的private static方法列表初始化使得一個比() => { ... }()() => { ... }.Invoke()

+0

順便說一句,你提出的替代語法(但忽視不可讀)不編譯。 (我建議刪除這個答案。) – ToolmakerSteve

1

更可讀的代碼您忘記了括號。使用這個:

public static readonly List<int> MyList = (() => 
{ 
    ... 
    return list; 
}); 
+0

注意:**不會編譯。**在不同的情況下,我測試了不同的版本後,我提出了這個問題,我確實需要一個代表而不是評估。現在無法改變我的upvote。 – ToolmakerSteve