2011-05-24 76 views
3

我正在開發一個庫,用於從SQL Server存儲過程檢索的數據中初始化普通舊數據對象。它的一個方法是以下各項之一:有什麼辦法讓C#不會抱怨實際上未初始化的未初始化變量?

public static T RetrieveCompound<T, U>(string cmdText, params Parameter[] parameters) 
    where T : Header<U>, new() 
    where U : class, new() { 

    Box<T> headerBox = new Box<T>(); 
    List<U> details; 
    Execute(cmdText, parameters, new Action<Row>[] { 
     SetReferenceAction<T>(headerBox) + 
     delegate(Row row) { details = headerBox.Value.Details; }, 
     delegate(Row row) { details.Add(row.ToObject<U>()); } 
    }); 
    return headerBox.Value; 
} 

Execute第三個參數是的Action<Row>秒的陣列。雖然沒有靜態分析器可以編程方式證明它,但由於Execute方法的編程方式,在數組之前沒有可以運行的委託。這意味着,在使用前委託

delegate(Row row) { details.Add(row.ToObject<U>()); } // use 

必然委託

delegate(Row row) { details = headerBox.Value.Details; } // initialize 

後運行,因此,變量details一定會被初始化。

但是C#仍然抱怨:「使用未分配變量的細節'。」

有什麼辦法讓C#不會抱怨未初始化的變量實際上不是?


我開始認爲C#不適合我。

+0

@Andrey:傳統的ORM專注於完整性,因此創建了大量元數據的大對象和類層次結構。相反,我的圖書館關注效率。例如,我的庫可以處理一次返回多個行集的存儲過程,這會在請求具有多個細節級別的實體時導致較少的服務器行程。 – pyon 2011-05-24 21:33:20

+0

有不同的肥胖程度的ORMs。我非常肯定,有一個類似於你的。 – Andrey 2011-05-24 22:00:56

+0

任何解決方法比只將其分配給null更簡單/更快/更簡單嗎? – cordialgerm 2011-05-25 02:08:56

回答

7

這是通常的解決方法:

List<U> details = null; 
3

它正在初始化爲空值是繞了一個辦法:

List<U> details = null; 

然後您可以將正確的數據分配給它,當你需要使用它。