新足迹

 找回密码
 注册

精华好帖回顾

· 年初回国,拍些见过的没见过的(填坑完毕) (2010-3-29) jmms_smmj · 我用D80拍自家女儿成长--一个学习中的爸爸体验分享 --55楼更新 (2010-6-16) kur7
· 关于 IB课程 的信息与讨论的集合贴 (2013-12-20) ahj · 碧邪的这一年~ (2011-1-3) 碧邪
Advertisement
Advertisement
查看: 4607|回复: 85

弱弱地问一下 C# System.Collection.Generic.List<T> [复制链接]

头像被屏蔽

禁止访问

发表于 2012-1-8 22:21 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我在C#里定义好这样1个class
public class SomeReferenceType
{
    int id;
    public SomeReferenceType(int id)
    {
        this.id = id;
    }
}

现在1个method里面有
......
System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };
System.Colletion.Generic.List<SomeReferenceType> list2 = list1; // 直接create a list2 (which is a reference-type object)
list1 = null // 现故意把list1设成null了,即list1指向null

请问现在list2里面是有2个SomeReferenceType objects, 还是说list2也指向null了?

(手头没有C#编译器,有请神人解答......)
Advertisement
Advertisement
头像被屏蔽

禁止访问

发表于 2012-1-8 22:33 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整

发表于 2012-1-8 22:42 |显示全部楼层
此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
list2 应该也是null,   因为list2本身并没有create, 所以它没有自己的地址.
头像被屏蔽

禁止访问

发表于 2012-1-8 23:00 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2012-1-8 23:42 发表
list2 应该也是null,   因为list2本身并没有create, 所以它没有自己的地址.


但是......

System.Colletion.Generic.List<SomeReferenceType> list2 = list1;
是create a new reference-type object called list2

这和
private void SomeMethod()
{
    System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };
    PointAListToAnUnknownValue(list1);
    // 现在list1里面还是有2个SomeReferenceType objects???
}
private void PointAListToAnUnknownValue(List<SomeReferenceType> list)
{
    ...
    list = null;
}
是一样的


但和
private void SomeMethod()
{
    System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };
    PointAListToAnUnknownValue_AnotherVersion(list1);
    // 现在list1应该指向null
}
private void PointAListToAnUnknownValue_AnotherVersion(ref List<SomeReferenceType> list)
{
    ...
    list = null;
}
是不一样的。

是这样的吗?

[ 本帖最后由 自由的心 于 2012-1-9 00:04 编辑 ]
头像被屏蔽

禁止访问

发表于 2012-1-8 23:13 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
PointAListToAnUnknownValue_AnotherVersion(ref List<SomeReferenceType> list)
参数list和外面caller传进来的list1不仅value相同,地址也相同。


PointAListToAnUnknownValue(List<SomeReferenceType> list)
参数list和外面caller传进来的list1仅仅value相同 (指向同一个list的内容,即a list of SomeReferenceType objects),但地址不同(list和list1是两个不同的reference-type objects)
头像被屏蔽

禁止访问

发表于 2012-1-8 23:18 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
希望晚上碰到周公来为我解释一下......
Advertisement
Advertisement

发表于 2012-1-8 23:26 |显示全部楼层
此文章由 kawara 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 kawara 所有!转贴必须注明作者、出处和本声明,并保持内容完整
顶纳粹程序员
头像被屏蔽

禁止访问

发表于 2012-1-8 23:35 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 hornsay 于 2012-1-8 23:42 发表
list2 应该也是null,   因为list2本身并没有create, 所以它没有自己的地址.

list2本身create了,而且list2本身的地址还和list1不同!......因为它们是两个不同的objects,它们的内容指向相同的地址罢了(这个被list1和list2所指向的地址里面的内容是a list of 2 SomeReferenceType objects)
周公也不来为我解惑,今天就先睡觉噜......
头像被屏蔽

禁止访问

发表于 2012-1-8 23:39 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 kawara 于 2012-1-9 00:26 发表
顶纳粹程序员

我不是做软件的,不属于IT......
只是业余爱好罢了

发表于 2012-1-9 13:30 |显示全部楼层

回复 自由的心 4# 帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Sorry 前面没有看到你已经new了list2.

Anyway, 我的理解是 object2 = object1, 通常是把object2 point 到object1的memory address, 所以假如你的object1没有value, 或者你的object1本身是null, object2也会是null.

这个和string2=string2是两样的, string 是把value assign过去(以前的概念是这样),而object是把地址assign 过去,而不是单单value.

所以你如果要把object1的value assign 给object2, 比较安全的方法可能是用已经有的method,或者你自己创建一个method来copy value.

p.s 你能不能让斑竹把这个贴子移到IT 板块,那里有很多高手。
持不同股见者...
头像被屏蔽

禁止访问

发表于 2012-1-9 19:57 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请斑竹把这个帖子移到IT版块吧......
Advertisement
Advertisement
头像被屏蔽

禁止访问

发表于 2012-1-9 21:17 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有请神人来解惑了......

发表于 2012-1-9 21:19 |显示全部楼层
此文章由 jerryclark 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 jerryclark 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 8/1/2012 10:21 PM 发表
我在C#里定义好这样1个class
public class SomeReferenceType
{
    int id;
    public SomeReferenceType(int id)
    {
        this.id = id;
    }
}

现在1个method里面有
......
System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };
System.Colletion.Generic.List<SomeReferenceType> list2 = list1; // 直接create a list2 (which is a reference-type object)
list1 = null // 现故意把list1设成null了,即list1指向null

请问现在list2里面是有2个SomeReferenceType objects, 还是说list2也指向null了?

(手头没有C#编译器,有请神人解答......)


list2 还是指向2个SomeReferenceType objects的那个list。

评分

参与人数 1积分 +2 收起 理由
flyspirit + 2 正解

查看全部评分

头像被屏蔽

禁止访问

发表于 2012-1-9 21:27 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
对了,这就是我所想的......
头像被屏蔽

禁止访问

发表于 2012-1-9 21:32 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
那么,有了
System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };

---------------------------------------------------------------------------------

System.Colletion.Generic.List<SomeReferenceType> list2 = list1;

System.Colletion.Generic.List<SomeReferenceType> list2 = new System.Colletion.Generic.List<SomeReferenceType>();
foreach (SomeReferenceType someReferenceType in list1)
{
    list2.Add(someReferenceType);
}
到底一样吗?

发表于 2012-1-9 21:37 |显示全部楼层
此文章由 yourock 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 yourock 所有!转贴必须注明作者、出处和本声明,并保持内容完整
请教LS几位年薪几多?
Advertisement
Advertisement

发表于 2012-1-9 21:44 |显示全部楼层

回复 自由的心 15# 帖子

此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不一样, 这样list2指向另一个list. 和list1的地址不同。
头像被屏蔽

禁止访问

发表于 2012-1-9 21:49 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2012-1-9 22:44 发表
不一样, 这样list2指向另一个list. 和list1的地址不同。

现在得出核心问题:
System.Colletion.Generic.List<SomeReferenceType> list2 = list1;
list2本身的地址 到底和 list1本身的地址相同吗?(地址 - 不是内容。而内容是list1 & list2指向的地址,这个指向的地址里内容是 a list of 2 SomeReferenceType objects)

发表于 2012-1-9 21:56 |显示全部楼层

回复 自由的心 15# 帖子

此文章由 hornsay 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 hornsay 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不一样。

list2.Add(object), 你是add object 进你的list, 而不是copy list1的地址。

其实如果你学过C 或C++, 这些都是memory management的基本常识。

通常你copy integer, float, string, e.g int a; int b; b=1; a=b; 你这是copy value. aftter copy, 如果你set b= 100, 这时a 仍然是1.

但是for object, 你copy的是地址而不是object本身。也就是说 object2 = object1, 这时任何改变在object1都会影响到object2.
持不同股见者...
头像被屏蔽

禁止访问

发表于 2012-1-9 22:03 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
object2 = object1
是制 object2和object1的内容一样了,即他们都指向相同的地址,这个地址里面的东西就是object1和object2所指的东西。通过改变object1,object2也会改变。
但是......
如果object1 = null; // 设置为null
object2 还是指向原来的地址,并不变为指向null.
头像被屏蔽

禁止访问

发表于 2012-1-9 22:04 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
重新问一下......

现在得出核心问题:
System.Colletion.Generic.List<SomeReferenceType> list2 = list1;
list2本身的地址 到底和 list1本身的地址相同吗?(地址 - 不是内容。而内容是list1 & list2指向的地址,这个指向的地址里内容是 a list of 2 SomeReferenceType objects)
Advertisement
Advertisement

发表于 2012-1-9 22:05 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-9 22:49 发表

现在得出核心问题:
System.Colletion.Generic.List list2 = list1;
list2本身的地址 到底和 list1本身的地址相同吗?(地址 - 不是内容。而内容是list1 & list2指向的地址,这个指向的地址里内容是 a list of 2 SomeReferenceType objects)


就是指地址相同, 不是内容。 你可以用==比较下, C#里面==比较的是地址。 比较内容用equals。
头像被屏蔽

禁止访问

发表于 2012-1-9 22:15 |显示全部楼层

interest

此文章由 atransformer 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 atransformer 所有!转贴必须注明作者、出处和本声明,并保持内容完整
System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };
这是啥语法??

不是应该
System.Colletion.Generic.List<SomeReferenceType> list1 = new System.Colletion.Generic.List<SomeReferenceType>();
list1.Add( new SomeReferenceType(1));
list1.Add( new SomeReferenceType(2));

么?
头像被屏蔽

禁止访问

发表于 2012-1-9 22:17 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 flyspirit 于 2012-1-9 23:05 发表


就是指地址相同, 不是内容。 你可以用==比较下, C#里面==比较的是地址。 比较内容用equals。

list2 = list1;
是指他们(list1 & list2)指向的地址相同吧?
头像被屏蔽

禁止访问

发表于 2012-1-9 22:23 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 atransformer 于 2012-1-9 23:15 发表
System.Colletion.Generic.List list1 = new System.Colletion.Generic.List { new SomeReferenceType(1), new SomeReferenceType(2) };
这是啥语法??

不是应该
System.Colletion.Generic.List list1 = new System.Co ...


这是List Initializer,和object initializer差不多,在CLR 2.0 SP1 (即.NET Framework version 3.5)后才有的......

发表于 2012-1-9 22:27 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-9 23:04 发表
重新问一下......

现在得出核心问题:
System.Colletion.Generic.List list2 = list1;
list2本身的地址 到底和 list1本身的地址相同吗?(地址 - 不是内容。而内容是list1 & list2指向的地址,这个指向的地址里内容是 a list of 2 SomeReferenceType objects)


同一个scope中任何两个variable的地址都不相同,任何语言都是这样。
Advertisement
Advertisement
头像被屏蔽

禁止访问

发表于 2012-1-9 22:28 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
看了C# 4.0 in a nutshell第19页后恍然大悟, object2 = object1 这样直接赋值后,他们还是不同的reference-type objects, 它们“本身”的地址也是不同的, 只不过它们指向的地址相同罢了......
头像被屏蔽

禁止访问

发表于 2012-1-9 22:34 |显示全部楼层
此文章由 自由的心 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 自由的心 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 无视 于 2012-1-9 23:27 发表


同一个scope中任何两个variable的地址都不相同,任何语言都是这样。

赞,神人啊,您的这句话让任何谬误变成砂子了......

发表于 2012-1-9 22:34 |显示全部楼层
此文章由 金靴 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 金靴 所有!转贴必须注明作者、出处和本声明,并保持内容完整
感觉好像都是学生
比较基本的
1) System.Colletion.Generic.List shall be System.Colletions.Generic.List, usually "using system.x.x" instead of full qualified name
2) list2 is not null, list2 is a reference to the object which list1 pointed before.
list2 = list1, it points to the object which list1 points to

发表于 2012-1-9 22:36 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 自由的心 于 2012-1-9 23:28 发表
看了C# 4.0 in a nutshell第19页后恍然大悟, object2 = object1 这样直接赋值后,他们还是不同的reference-type objects, 它们“本身”的地址也是不同的, 只不过它们指向的地址相同罢了......


这个太高级,如果你再看看编译原理/汇编/c++/c,你就知道object在内存怎么分配的,method怎么call的这些基础的东西,跟具体语言没什么特别大的关系。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部