Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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#_List_Class_Generics - Fatal编程技术网

C# 列表是通过引用还是通过创建新的添加对象实例以供自己使用来添加新对象?

C# 列表是通过引用还是通过创建新的添加对象实例以供自己使用来添加新对象?,c#,list,class,generics,C#,List,Class,Generics,我是c语言的新手,在理解一个问题时遇到了问题 方法bellow只返回所有记录记录计数时间的最后一个记录值 公开名单 { var listBanke=新列表; 使用SqlConnection NConnection=new SqlConnectionParams.ConnectionStr { n连接。打开; 使用var cmd=new SqlCommandSELECT*FROM[dbo].[BANKE],n连接 { SqlDataReader=cmd.ExecuteReader; var rec

我是c语言的新手,在理解一个问题时遇到了问题

方法bellow只返回所有记录记录计数时间的最后一个记录值

公开名单 { var listBanke=新列表; 使用SqlConnection NConnection=new SqlConnectionParams.ConnectionStr { n连接。打开; 使用var cmd=new SqlCommandSELECT*FROM[dbo].[BANKE],n连接 { SqlDataReader=cmd.ExecuteReader;
var recBanke=new Banke;//在第一个示例中,您正在覆盖Banke变量的相同实例

您需要每个对象的一个新实例。您可以这样做以避免混淆

    using (var cmd = new SqlCommand("SELECT * FROM [dbo].[BANKE]", NConnection))
    {
        SqlDataReader reader = cmd.ExecuteReader();

            // you don't need to test if your reader has rows

            while (reader.Read())
            {
                listBanke.Add(new Banke{
                   banka_id = reader["BANKA_ID"] as int? ?? 0,
                   pun_naziv = reader["PUN_NAZIV"] as string,
                   sk_naziv = reader["SK_NAZIV"] as string,
                   ino = reader["ino"] as bool? ?? false
                });                              
            }                                              
        reader.Close(); 
    }

在第一个代码块中,您只需更改单个BANKE实例的属性。在第二个步骤中,您为从DB返回的每一行创建一个新的实例。学习C中的引用类型。关闭得太宽而不是错误的重复……考虑重复。需要有人向我解释这是一个该死的愚蠢标题。一个问题。请更改此项以包含更多详细信息…类似的问题:我理解,但为什么第一个案例会返回表中最后一条记录的记录计数次数值?@EmirZ,因为您在列表中反复放置相同的recBank副本。因此,当您更改它时,您会修改列表中的所有元素。因此SqlDataReader reader在通过记录进行迭代时不会覆盖recBanke中的值?@EmirZ否,它会覆盖,这就是问题所在。listBanke中的所有插槽都指向一个Banke对象,因此,当您覆盖banka_id时,所有插槽都会更新,因为只有一个对象存在,在第二个示例中,您创建了一个新的recBanke,每个循环都是这样的你没有覆盖旧的值。谢谢斯科特!现在我明白了。
    using (var cmd = new SqlCommand("SELECT * FROM [dbo].[BANKE]", NConnection))
    {
        SqlDataReader reader = cmd.ExecuteReader();

            // you don't need to test if your reader has rows

            while (reader.Read())
            {
                listBanke.Add(new Banke{
                   banka_id = reader["BANKA_ID"] as int? ?? 0,
                   pun_naziv = reader["PUN_NAZIV"] as string,
                   sk_naziv = reader["SK_NAZIV"] as string,
                   ino = reader["ino"] as bool? ?? false
                });                              
            }                                              
        reader.Close(); 
    }