C# 在循环中,在每次迭代中使用同一个对象或实例化一个新对象,哪个更好?
在下面显示的示例中,前一种方法为每次迭代实例化一个类型为C# 在循环中,在每次迭代中使用同一个对象或实例化一个新对象,哪个更好?,c#,object,coding-style,C#,Object,Coding Style,在下面显示的示例中,前一种方法为每次迭代实例化一个类型为SearchResult的对象,而后一种方法只实例化一次对象,并在所有迭代中使用它 using (DbDataReader reader = (DbDataReader)dbObject.ExecuteReader(command)) { if (reader.HasRows) { List<SearchResult> searchR
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);
}
}
}
使用(DbDataReader=(DbDataReader)dbObject.ExecuteReader(命令))
{
if(reader.HasRows)
{
列表搜索结果=新列表();
while(reader.Read())
{
SearchResult SearchResult=新的SearchResult();
searchResult.AppName=Convert.ToString(读卡器[“AppName”]);
searchResults.Add(searchResult);
}
}
}
或
使用(DbDataReader=(DbDataReader)dbObject.ExecuteReader(命令))
{
if(reader.HasRows)
{
列表搜索结果=新列表();
SearchResult SearchResult=新的SearchResult();
while(reader.Read())
{
searchResult.AppName=Convert.ToString(读卡器[“AppName”]);
searchResults.Add(searchResult);
}
}
}
处理这个问题哪种方法更好
谢谢,请不要理会我的天真。:) 第一种方法更好,因为第二种方法不会像预期的那样工作,因为您每次都在使用同一个实例并重写属性。您将得到一个具有相同值的SearchResult列表!所以肯定是第一个版本 每次都需要使用第一个版本或实例化一个新实例,如下所示:
SearchResult searchResult;
while (reader.Read())
{
searchResult = new SearchResult();
searchResult.AppName = Convert.ToString(reader["AppName"]);
searchResults.Add(searchResult);
}
EDIT这当然是假设
SearchResult
是一个类,如果它实际上是一个结构,那么它就是一个值类型,这不会是一个问题第一种方法更好,因为第二种方法不会像预期的那样工作,因为您每次都使用同一个实例并过度编写属性。您将得到一个具有相同值的SearchResult列表!所以肯定是第一个版本
每次都需要使用第一个版本或实例化一个新实例,如下所示:
SearchResult searchResult;
while (reader.Read())
{
searchResult = new SearchResult();
searchResult.AppName = Convert.ToString(reader["AppName"]);
searchResults.Add(searchResult);
}
EDIT这当然是假设
SearchResult
是一个类,如果它实际上是一个结构,那么它就是一个值类型,这不会是一个问题^^^^^好的,但我正在更改属性的值,并将实例添加到公共范围内的列表中,那么为什么它会为每个列表项生成相同的值呢?因为您每次都使用相同的SearchResult实例,并向列表添加相同的引用,所以更改该实例上的属性会更改列表中所有引用相同的属性instance@Dienekes:因为对象是引用类型,当您只有一个对象(因为您只声明了一个对象)时,即使您多次将其插入列表、数组或其他对象,您真正要做的就是在内存中对同一位置进行多个不同的引用:即,对同一对象的多个引用。您如何知道SearchResult是class而不是struct?^^^好的,但我正在更改属性的值并将实例添加到公共范围内的列表中,那么为什么它会导致每个列表项的值相同?因为您每次都使用相同的SearchResult实例,并将相同的引用添加到列表中,因此更改该实例上的属性会更改列表中所有引用相同的属性instance@Dienekes:因为对象是引用类型,当您只有一个对象(因为您只声明了一个对象)时,即使您多次将其插入列表、数组或其他任何对象,实际上,您所做的只是在内存中对同一位置进行多个不同的引用:也就是说,对同一对象进行多个引用。您如何知道SearchResult是类而不是结构?