2010-08-12 34 views
0

在下面顯示的示例中,前一種方法爲每個迭代實例化SearchResult類型的對象,而後者僅實例化該對象一次,並將其用於所有迭代。在循環中什麼更好,在每次迭代中使用同一個對象或實例化一個新對象?

using (DbDataReader reader = (DbDataReader)dbObject.ExecuteReader(command)) 
     { 
      if (reader.HasRows) 
      { 
       List<SearchResult> searchResults = new List<SearchResult>(); 
       while (reader.Read()) 
       { 
        SearchResult searchResult = new SearchResult(); 
        searchResult.AppName = Convert.ToString(reader["AppName"]); 
        searchResults.Add(searchResult); 
       } 
      } 
     } 

OR

using (DbDataReader reader = (DbDataReader)dbObject.ExecuteReader(command)) 
     { 
      if (reader.HasRows) 
      { 
       List<SearchResult> searchResults = new List<SearchResult>(); 
       SearchResult searchResult = new SearchResult(); 
       while (reader.Read()) 
       {       
        searchResult.AppName = Convert.ToString(reader["AppName"]); 
        searchResults.Add(searchResult); 
       } 
      } 
     } 

哪個是更好的方法來處理呢?

謝謝你,並善待我的天真。 :)

回答

5

第一種方法更好,因爲第二種方法不會像預期的那樣工作,因爲您每次都在使用相同的實例並編寫該屬性。你將會得到一個具有所有相同值的SearchResult列表!所以絕對是第一個版本。

您需要使用的第一個版本或類似這樣的,每次實例化一個新的實例:

SearchResult searchResult; 
while (reader.Read()) 
{ 
     searchResult = new SearchResult(); 
     searchResult.AppName = Convert.ToString(reader["AppName"]); 
     searchResults.Add(searchResult); 
} 

編輯當然這是假設SearchResult的一類,如果它實際上是一個結構則是一個值類型,這不會是一個問題

+0

^^好吧,但我正在更改屬性的值並將該實例添加到列表中的一個公共範圍內,爲什麼它會導致每個列表的值相同項目? – Dienekes 2010-08-12 10:38:12

+2

因爲您每次都使用SearchResult的相同實例,並且將相同的引用添加到列表中,所以更改該實例上的屬性會將其更改爲列表中的所有內容,因爲它們引用同一個實例 – w69rdy 2010-08-12 10:41:03

+1

@Dienekes:因爲對象是引用類型,即使你只有一個對象(因爲你只聲明一個對象),即使你多次插入一個List,或者Array或者其他的東西,但是你真正做的所有事情都是以幾個不同的引用結束在內存中的位置:也就是說,對同一個對象的多個引用。 – AllenG 2010-08-12 10:48:02

相關問題