list<string>.add(string)是传的值还是传的地址String

解决方案 »

  1.   

    引用
    你可以看看这篇文章:
    http://blog.csdn.net/masterft/article/details/1727151
      

  2.   

    引用类型所以new 一个list, 即便值相同,你用equlas比较也是认为不同的
      

  3.   

    赋值 是引用地址指向改变
    new一个list是在内存开辟了新 的空间,引用地址指向新的空间。
      

  4.   

    在C#中,所有用对象类型当函数参数的,传的都是引用,函数内部无法改变引用所指的对象,但是可以修改对象的属性。如果要在函数内修改引用所指向的对象,参数就要声明为ref或者out。
    而所有的值类型,包括预定义的各种数值类型,枚举类型以及Struct声明的类型,当成函数参数时,传的都是值,函数内对值或Struct的属性的修改,都无法反映到函数的调用者的scope中。
      

  5.   

    List内部的是一个顺序存储结构:
    看下这内部实现就知道,根据T的类型来决定的,如果是传人的值类型,当然就是传值,引用类型就是传递的地址,但是string是一个特殊的情况,它是引用类型,但是传递后给方法后是一个新的string,在方法内部改变后,它之前的值却是不受影响的,这就会造成值类型的一个假象。
      

  6.   

    我想知道,如果我
    string sample="0";
    for(i=0;i<10;i++){list<string>.add(sample)
    }
    sample.clear();
    list中的值还有吗?
      

  7.   

    Quote: 引用 7 楼 mmqw1122 的回复:

    我想知道,如果我
    string sample="0";
    for(i=0;i<10;i++){list<string>.add(sample)
    }
    sample.clear();
    list中的值还有吗?
    list中当然会有值,你看我上面回复的,你这个sample字符串到add中是重新创建一个string字符串,你sample的任何修改都不会对内部方法有影响的
      

  8.   

    好的明白了,谢了,传的是地址,不过传入add的string会重新申请一个新的,所以和for循环中重新定义一个string在list中是一个效果的,都是重新定义了string
      

  9.   

    string是一个特殊的类型 
    这里的string清空了,list中还是有值的
    但是其他的引用类型 值改变了  list中的值也是会变的
    例:
      public class AAAAA
        {
            public int AAA { get; set; }
        }
        class Program
        {      
            static void Main(string[] args)
            {          
                AAAAA a = new AAAAA();
                a.AAA = 111;
                List<AAAAA> list = new List<AAAAA>();
                for (int i = 0; i < 10; i++)
                {
                    list.Add(a);
                }
                a.AAA = 222;
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(list[i].AAA);
                }
                Console.ReadKey();
            }
        }