2014-02-21 61 views
0

基本上我有一個函數,如下,其允許用戶登錄時執行的應用程序:C#VAR基本理解

public void login(){ 
    //Call StoredProc get a list of records 
    //and add the results into a list<T> SPList 

    var tempList = SPList.Where(x=>x.Status==1); 
    int counter = tempList.Count(); 

    //What is the number of counter? 
} 

現在,當用戶第一次運行應用程序,login功能將被執行並tempList.Count()預期爲。

當用戶運行相同的方法再次login(),所述tempList.Count()現在變得 ??

,如果用戶殺死的應用程序並重新啓動它,tempList.Count()將回2再次

是不是關鍵字VAR會刷新並每次返回2?爲什麼它保存舊數據並擴展而不是刷新?

+2

'var'是一種紅鯡魚,我懷疑。在哪裏/如何定義SPList? –

回答

2

我想你不明白var是做什麼的。使用var,編譯器會嘗試瞭解您的方法返回的是哪種類型。

你的問題是你在內存中保留一個列表,添加東西的地方,因此計數會得到更新。在重新啓動時,該列表再次爲空,因此您將從0開始。

2

這與'var'無關。 Var只是一個允許您在聲明變量時不必鍵入類型的功能。

它與LINQ的內部工作有更多的關係。你應該明白你的變量tempList不是持有一個List或者Collection,而是一個表達式。 每次你對'tempList'進行一個操作(比如調用Count()或迭代它),表達式將被再次評估。

此:

var tempList = SPList.Where(x=>x.Status==1); 
int counter = tempList.Count(); 

將表現完全不同的比這:

var tempList = SPList.Where(x=>x.Status==1).ToList(); 
int counter = tempList.Count(); 

在第二碼樣本,變量「tempList」確實包含一個列表,而在第一代​​碼 - 樣本,變量tempList包含一個表達式。

當您將一個新對象添加到SPList並再次調用tempList時,新項目將包含在第一個代碼示例中的計數中,而在第二個代碼示例中它將不包含在內。 (因爲在第二個示例中,tempList現在是一個分隔符列表,而在第一個示例中,對SPList中的項目進行計數的表達式會再次執行)。

+0

'Count()'應該返回來自你顯示的任何變體的一致結果,如果'SPList'的內容保持不變,所以我不同意你的「將表現完全不同」 - 在這種情況下,只使用'Count',結果應該是相同的。 –

+0

只有使用'IQueryable'集合執行此答案纔是真實的。正常的LINQ不會延遲。除非我誤解你的意思.. –