在循环中哪个更好,使用相同的对象或在每次迭代时实例化一个新对象?

Die*_*kes 0 c# coding-style object

在下面显示的示例中,前一种方法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);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

要么

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);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

哪种方法更好?

谢谢,请理睬我的天真.:)

Iai*_*ard 5

第一种方法更好,因为第二种方法不会像预期的那样工作,因为每次使用相同的实例而不是写入属性.你最终会得到一个具有相同价值的SearchResult列表!所以绝对是第一个版本.

您需要使用第一个版本或每次实例化一个新实例,如下所示:

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

编辑 这当然SearchResult是假设是一个类,如果它实际上是一个结构,那么它是一个值类型,这不会是一个问题

  • 因为您每次都使用相同的SearchResult实例,并且向List添加相同的引用,所以更改该实例上的属性会更改列表中的所有属性,因为它们引用相同的实例 (2认同)