List赋值传值还是地址

mmqw 2013-07-30 09:26:24
list<string>.add(string)是传的值还是传的地址
...全文
799 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
瑞卡哥哥 2013-07-30
  • 打赏
  • 举报
回复
这个输出是10个 222
瑞卡哥哥 2013-07-30
  • 打赏
  • 举报
回复
引用 7 楼 mmqw1122 的回复:
我想知道,如果我
string sample="0";
for(i=0;i<10;i++){

list<string>.add(sample)
}
sample.clear();
list中的值还有吗?





[quote=引用 1 楼 sjyforg 的回复:]
引用
你可以看看这篇文章:
http://blog.csdn.net/masterft/article/details/1727151


引用 2 楼 shawn_yang 的回复:
引用类型

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


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


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



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();
}
}

mmqw 2013-07-30
  • 打赏
  • 举报
回复
搞清楚了,谢了各位,结贴了
mmqw 2013-07-30
  • 打赏
  • 举报
回复
引用 8 楼 liu_ben_qian 的回复:
[quote=引用 7 楼 mmqw1122 的回复:] 我想知道,如果我 string sample="0"; for(i=0;i<10;i++){ list<string>.add(sample) } sample.clear(); list中的值还有吗? list中当然会有值,你看我上面回复的,你这个sample字符串到add中是重新创建一个string字符串,你sample的任何修改都不会对内部方法有影响的
好的明白了,谢了,传的是地址,不过传入add的string会重新申请一个新的,所以和for循环中重新定义一个string在list中是一个效果的,都是重新定义了string
wolf_ben 2013-07-30
  • 打赏
  • 举报
回复
[quote=引用 7 楼 mmqw1122 的回复:] 我想知道,如果我 string sample="0"; for(i=0;i<10;i++){ list<string>.add(sample) } sample.clear(); list中的值还有吗? list中当然会有值,你看我上面回复的,你这个sample字符串到add中是重新创建一个string字符串,你sample的任何修改都不会对内部方法有影响的
mmqw 2013-07-30
  • 打赏
  • 举报
回复
我想知道,如果我 string sample="0"; for(i=0;i<10;i++){ list<string>.add(sample) } sample.clear(); list中的值还有吗?
引用 1 楼 sjyforg 的回复:
引用 你可以看看这篇文章: http://blog.csdn.net/masterft/article/details/1727151
引用 2 楼 shawn_yang 的回复:
引用类型 所以new 一个list, 即便值相同,你用equlas比较也是认为不同的
引用 3 楼 zhouqinghe24 的回复:
赋值 是引用地址指向改变 new一个list是在内存开辟了新 的空间,引用地址指向新的空间。
引用 4 楼 pkudzy 的回复:
在C#中,所有用对象类型当函数参数的,传的都是引用,函数内部无法改变引用所指的对象,但是可以修改对象的属性。如果要在函数内修改引用所指向的对象,参数就要声明为ref或者out。 而所有的值类型,包括预定义的各种数值类型,枚举类型以及Struct声明的类型,当成函数参数时,传的都是值,函数内对值或Struct的属性的修改,都无法反映到函数的调用者的scope中。
wolf_ben 2013-07-30
  • 打赏
  • 举报
回复
List内部的是一个顺序存储结构: 看下这内部实现就知道,根据T的类型来决定的,如果是传人的值类型,当然就是传值,引用类型就是传递的地址,但是string是一个特殊的情况,它是引用类型,但是传递后给方法后是一个新的string,在方法内部改变后,它之前的值却是不受影响的,这就会造成值类型的一个假象。
瑞卡哥哥 2013-07-30
  • 打赏
  • 举报
回复
add 也是引用地址
闲云之然 2013-07-30
  • 打赏
  • 举报
回复
在C#中,所有用对象类型当函数参数的,传的都是引用,函数内部无法改变引用所指的对象,但是可以修改对象的属性。如果要在函数内修改引用所指向的对象,参数就要声明为ref或者out。 而所有的值类型,包括预定义的各种数值类型,枚举类型以及Struct声明的类型,当成函数参数时,传的都是值,函数内对值或Struct的属性的修改,都无法反映到函数的调用者的scope中。
瑞卡哥哥 2013-07-30
  • 打赏
  • 举报
回复
赋值 是引用地址指向改变 new一个list是在内存开辟了新 的空间,引用地址指向新的空间。
shawn_yang 2013-07-30
  • 打赏
  • 举报
回复
引用类型 所以new 一个list, 即便值相同,你用equlas比较也是认为不同的
申江渔夫 2013-07-30
  • 打赏
  • 举报
回复
引用 你可以看看这篇文章: http://blog.csdn.net/masterft/article/details/1727151

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧