List<引用类型>的赋值问题

西奥 2013-04-23 08:52:27
定义:
List<MyClass> list;
MyClass myclass;
DataTable da; //表中包含MyClass的属性
通过for循环赋值
for(i=0;i<x;i++)
{
myclass= new MyClass();
myclass.Pr1=da.Rows[i][0].ToString();
list.Add(myclass)
}
这样的结果就是list中所有的item都已指向了一个myclass实例。
之后我再MyClass类中定义了一个Copye的方法,来获得一个全新的实例
问题是:我这种做法是不是常规做法,正确的方法应该是什么?
...全文
3052 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
古城浪子 2014-09-10
  • 打赏
  • 举报
回复
这样用不就行了,无需拷贝 MyClass myclass = (MyClass)List[i]
西奥 2013-04-24
  • 打赏
  • 举报
回复
引用 21 楼 qldsrx 的回复:
学习并使用.NET,应该把思想放到应用层次,而不是堆栈处理上,.NET帮我们处理了与应用无关的技术部分,这样可以更快速的开发程序,这是优势,如果放弃这层优势,那就等于回到了C++的年代。 这里从应用层考虑,只能这么做: 一、如果循环内部不是new一个新对象,那么List添加的将是同一个对象的引用,这不符合要求,集合中的元素应该是不同的,否则我用一个变量表示足够。 二……
多谢,明白你说的意思,哎,自己把自己绕进入了。
qldsrx 2013-04-24
  • 打赏
  • 举报
回复
学习并使用.NET,应该把思想放到应用层次,而不是堆栈处理上,.NET帮我们处理了与应用无关的技术部分,这样可以更快速的开发程序,这是优势,如果放弃这层优势,那就等于回到了C++的年代。 这里从应用层考虑,只能这么做: 一、如果循环内部不是new一个新对象,那么List添加的将是同一个对象的引用,这不符合要求,集合中的元素应该是不同的,否则我用一个变量表示足够。 二、如果不用变量临时存储新对象,那么访问对象的属性(赋值)就必须通过List的索引来访问,效率比直接访问变量慢得多。
qldsrx 2013-04-24
  • 打赏
  • 举报
回复
引用 18 楼 dzbCCNA 的回复:
在循环外部声明了变量 myclass,是在栈上分配了一段内存,但是并没有指向堆中的任何数据,在for循环中new了对象,然后有了指向堆的指针,通过MyClass类的Copy方法复制了一个新的对象那么,在list中所引用的是是这个新Copy出来的对象,之前在堆上分配的不就落空了吗?
先请问你C#编程有多长时间了?如果不满一年,最好先别去研究堆栈上面的分配方式,只会越高越糊涂。.NET的垃圾回收是自动的,无需也无法手动干预。你这里不涉及非托管对象,因此根本没有垃圾产生的情况,不要用C++的思想来考虑问题。
assky124 2013-04-24
  • 打赏
  • 举报
回复
MSDN上看看值类型和引用类型的区别。 举个通俗的例子,可能不是很对,只是帮助理解 值类型就是 张三 就是这个人。 引用型就是有个电话号码(13xxx),你通过号码可以找到张三。但是运营上(其实就是程序员了)有可能会改变号码(13xxx = new 李四()),这样通过号码找到的就是李四而不是张三了。
西奥 2013-04-24
  • 打赏
  • 举报
回复
引用 13 楼 qldsrx 的回复:
引用 10 楼 dzbCCNA 的回复:引用 8 楼 linrachel 的回复:你这样做实际上每一次都把上次的对象丢弃了,变成了垃圾。要把MyClass声明放到循环里面。 的确,这样做会产生许多垃圾,多谢提醒 不要被他误导,初学者很容易被各种说法误导,在CSDN上可以根据对方的技术分高低来判断回复的可行度。 你这里根本没有变为垃圾,List本身在引用它,而且通过索……
在循环外部声明了变量 myclass,是在栈上分配了一段内存,但是并没有指向堆中的任何数据,在for循环中new了对象,然后有了指向堆的指针,通过MyClass类的Copy方法复制了一个新的对象那么,在list中所引用的是是这个新Copy出来的对象,之前在堆上分配的不就落空了吗?
E次奥 2013-04-24
  • 打赏
  • 举报
回复
List<MyClass>没有实例化。
游戏人间 2013-04-24
  • 打赏
  • 举报
回复
这个绝对是正确的。
玄天_wilion 2013-04-24
  • 打赏
  • 举报
回复
引用是指向堆的。 你自己重写Clone方法,方法里面 new 一个实例
Banianer 2013-04-24
  • 打赏
  • 举报
回复
引用 2 楼 dzbCCNA 的回复:
真的?但是感觉这种办法有点蠢
在某些情况下的确是,特别是针对一部分极端的高手来说。
破落男孩 2013-04-24
  • 打赏
  • 举报
回复
完全可以啊 没问题
stonespace 2013-04-24
  • 打赏
  • 举报
回复
你这个写法没错,不会指向一个实例,你每次new都回创建新实力,
  • 打赏
  • 举报
回复
引用 8 楼 linrachel 的回复:
你这样做实际上每一次都把上次的对象丢弃了,变成了垃圾。要把MyClass声明放到循环里面。
我感觉他这样没什么问题的吧,毕竟他只是想把每个myclass对象放到list里吧
linrachel 2013-04-23
  • 打赏
  • 举报
回复
你这样做实际上每一次都把上次的对象丢弃了,变成了垃圾。要把MyClass声明放到循环里面。
moonwrite 2013-04-23
  • 打赏
  • 举报
回复
这样的结果就是list中所有的item都已指向了一个myclass实例。 应该是每个item都对应一个实力的吧 你都是不断地new出来的~
西奥 2013-04-23
  • 打赏
  • 举报
回复
引用 3 楼 qiujialongjjj 的回复:
也可以用linq实现 C# code?12345678910if (dtTable != null && dtTable.Rows.Count > 0) { List<ClientStruct> list = (from a in dtTable.AsEnumerable() orderby a.Fi……
linq还要学习
西奥 2013-04-23
  • 打赏
  • 举报
回复
.....俺是初学的
linrachel 2013-04-23
  • 打赏
  • 举报
回复
引用 10 楼 dzbCCNA 的回复:
引用 8 楼 linrachel 的回复:你这样做实际上每一次都把上次的对象丢弃了,变成了垃圾。要把MyClass声明放到循环里面。 的确,这样做会产生许多垃圾,多谢提醒
楼主请参照13楼的说法,前面我说错了,对不起。。
linrachel 2013-04-23
  • 打赏
  • 举报
回复
引用 13 楼 qldsrx 的回复:
引用 10 楼 dzbCCNA 的回复:引用 8 楼 linrachel 的回复:你这样做实际上每一次都把上次的对象丢弃了,变成了垃圾。要把MyClass声明放到循环里面。 的确,这样做会产生许多垃圾,多谢提醒 不要被他误导,初学者很容易被各种说法误导,在CSDN上可以根据对方的技术分高低来判断回复的可行度。 你这里根本没有变为垃圾,List本身在引用它,而且通过索……
的确是你说的这样,list本身有对于那个对象的引用,我说错了。多谢指正。。
  • 打赏
  • 举报
回复
引用 2 楼 dzbCCNA 的回复:
真的?但是感觉这种办法有点蠢
你至少骂了80%的coder
加载更多回复(7)

110,561

社区成员

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

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

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