Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在循环中,在每次迭代中使用同一个对象或实例化一个新对象,哪个更好?_C#_Object_Coding Style - Fatal编程技术网

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是类而不是结构?