zoukankan      html  css  js  c++  java
  • C# 心得 List.Add() 函数添加的到底是什么?记一次莫名其妙的失误!

    失误描述:

    我遇到的是这样的情况,自定义类,然后定义此类的List,然后在循环里添加类到 list 中,但是最后我发现结束后再一次循环输出的结果,只有最后一次的list里全是最后一次的内容!翻看 MSDN中List<T>.Add(T) 的内容发现我在循环里一直用同一个temp,导致list中都导向同一个temp,所以都是这最后一次修改的值!而文档中的示例则是: parts.Add(new Part() {PartName="crank arm", PartId=1234}); 使用的是new 的新实例,所以我怀疑是传引用的参数,在使用自己的类的情况下,Add并不是传的示例!


    测试:

    T 用string型测试

     1 List<string> test_add_func = new List<string>();
     2 string add_content = "";
     3 for(int i=0; i < 3; i++)
     4 {
     5     add_content = i.ToString();
     6     test_add_func.Add(add_content);
     7 }
     8 test_add_func.ForEach(
     9   delegate (string child) { print(child); }
    10   );
    • 输出结果是0 1 2

    T 用struct型测试

     1 /*已定义*/ struct test_add { public string m_function; };
     2 
     3 List<test_add> test_add_func2 = new List<test_add>();
     4 test_add add_content2 = new test_add { };
     5 add_content2.m_function = "";
     6 for (int i = 0; i < 3; i++)
     7 {
     8     add_content2.m_function = i.ToString();
     9     test_add_func2.Add(add_content2);10 }
    11 test_add_func2.ForEach(
    12      delegate (test_add child) { print(child.m_function); }
    13      );
    • 输出结果也是0 1 2

    T 用自己的类测试

    /*已定义*/ class test_add { public string m_function; };
    List<test_add> test_add_func2 = new List<test_add>();
    test_add add_content2 = new test_add { };
    add_content2.m_function = "";
    for (int i = 0; i < 3; i++)
    {
        add_content2.m_function = i.ToString();
        test_add_func2.Add(add_content2);
    }
    test_add_func2.ForEach(
        delegate (test_add child) { print(child.m_function); }
        );
    test_add_func2[0].m_function = "change";
    print(add_content2.m_function);
    print(test_add_func2[1].m_function);
    • 输出结果为:2 2 2 change change

    可见,对于自己定义的类用的是传引用参数!所以要想每个list内容独立,应该传实例像这样 test_add_func2.Add(new test_add { m_function = i.ToString() }); ,这样一来add_content2的内容就不会影响List内容了。


    总结:

    当使用List的Add函数时,int、struct、string等自带的类可以随意使用,不会传引用参数;但是自定义的类,实际上是传的引用,故需要new 来避免传参导致项目出现不好发现的bug,以上。

  • 相关阅读:
    浮点数大于0
    坐标变换
    实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
    计算sigma
    ECharts 在winform中使用(访问JS)
    Linux用户锁定、解锁及锁定查看
    vue或者js中平均分割数组
    python 文件读写with open模式r,r+,w,w+,a,a+的区别
    vue 三元表达式当出现elif
    后端排序时去掉element表格排序的null状态
  • 原文地址:https://www.cnblogs.com/wayne-tao/p/11319926.html
Copyright © 2011-2022 走看看