对数组CopyTo方法的困惑

路人甲cw 2011-06-19 09:57:33
先贴一段代码:

class MyClass
{
public int i;
}
static void Main(string[] args)
{
MyClass[] myClasses1 = new MyClass[1];
MyClass[] myClasses2 = new MyClass[1];

myClasses1[0] = new MyClass();
myClasses1[0].i = 1;

myClasses1.CopyTo(myClasses2, 0);
//myClasses2 = myClasses1;
myClasses2[0].i = 2;

Console.WriteLine("myClasses1[0].i:{0}\nmyClasses2[0].i:{1}", myClasses1[0].i, myClasses2[0].i);
Console.WriteLine(myClasses1 == myClasses2);
}

我知道采用CoyTo方法与等号对于引用类型的数组来讲都是拷贝对象的引用地址,但为什么使用CopyTo方法时输出myClasses1 == myClasses2时为False而用等号时输出为True?
我想知道使用CopyTo时发生了什么?在内存里有什么不同?
...全文
226 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人甲cw 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 icedmilk 的回复:]

汗,我说错了
它就初始化了一堆引用,需要自己去初始化



引用 7 楼 gaoqiangz 的回复:
引用 6 楼 icedmilk 的回复:

你定义的所有变量实际就只是一个引用(受限的指针)
只有调用new运算符的时候这个引用就会被关联到一个对象

你定义的myClasses1就是一个引用,new了之后,这个引用就指向了一个Array对象

这个Array对象的组……
[/Quote]
非常感谢,结帖!
Icedmilk 2011-06-20
  • 打赏
  • 举报
回复
汗,我说错了
它就初始化了一堆引用,需要自己去初始化



[Quote=引用 7 楼 gaoqiangz 的回复:]
引用 6 楼 icedmilk 的回复:

你定义的所有变量实际就只是一个引用(受限的指针)
只有调用new运算符的时候这个引用就会被关联到一个对象

你定义的myClasses1就是一个引用,new了之后,这个引用就指向了一个Array对象

这个Array对象的组成是一份列表,列表里的每一项又是一个引用,而你代码里这个Array对象的列表里只有一个引用,这个引用指向了那个MyCl……
[/Quote]
路人甲cw 2011-06-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 icedmilk 的回复:]

你定义的所有变量实际就只是一个引用(受限的指针)
只有调用new运算符的时候这个引用就会被关联到一个对象

你定义的myClasses1就是一个引用,new了之后,这个引用就指向了一个Array对象

这个Array对象的组成是一份列表,列表里的每一项又是一个引用,而你代码里这个Array对象的列表里只有一个引用,这个引用指向了那个MyClass对象,MyClass对象的创建是在Arr……
[/Quote]
"MyClass对象的创建是在Array对象创建时的构造函数里创建的",这句话我有点不理解,如果当Array对象创建时它的元素成员也跟着被创建,那也就是说我声明了一个元素为引用类型的数组后,就可以直接可以用点操作符访问元素所指的对象了?不需要再手动创建一个对象去关联这个元素了?
Icedmilk 2011-06-19
  • 打赏
  • 举报
回复
你定义的所有变量实际就只是一个引用(受限的指针)
只有调用new运算符的时候这个引用就会被关联到一个对象

你定义的myClasses1就是一个引用,new了之后,这个引用就指向了一个Array对象

这个Array对象的组成是一份列表,列表里的每一项又是一个引用,而你代码里这个Array对象的列表里只有一个引用,这个引用指向了那个MyClass对象,MyClass对象的创建是在Array对象创建时的构造函数里创建的


你的代码中,如果直接赋值的话,就是将myClasses1和myClasses2这两个引用关联到了同一个Array对象

而如果用CopyTo就是将myClasses2所指向的Array对象设置为和myClasses1所指对象一样的内容
路人甲cw 2011-06-19
  • 打赏
  • 举报
回复
那么myClasses1 与 Array object,MyClass object它们之间存在什么样的关系?
声明数组时实际上是声明了一个指向Array object的变量?然后访问数组中的元素实际上是通过Array object的序列去访问的??
btxp163 2011-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 icedmilk 的回复:]

CopyTo之后又两个数组Object
赋值之后只有一个数组Object
这就是区别
Assembly code

最开始
myClasses1 -> Array object -> MyClass object
myClasses2 -> Array object -> MyClass object

如果用赋值运算:
myClasses1 -\
|-> ……
[/Quote]

解释的很清楚,这表达很直观
路人甲cw 2011-06-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 porschev 的回复:]
昨天回过你了啊。。

等号是把B的引用给了A,A和B指向同一个对象

CopyTo是把B完全复制一份给A,现在有了两个对象。。

用等号。。。。如果修改了A和B任何一个。。。他们两都会被修改。。。

他们的指向的是同一个
[/Quote]
是的,但是我不知道原来数组还有像2楼说的那层关系,而你说的"CopyTo是把B完全复制一份给A,现在有了两个对象"让我有点晕,因为我发现如果数组是引用类型的,那么就算是CopyTo了之后修改其中一个数组引用的对象,另一个数组引用的对象也会改变,也就是说并不是有了两个对象,而它们仍然是引用的同一个对象,如果像2楼说的,数组和对象之间还有一个Array object中间对象的话,那还好理解一些
不知道我说对没有?
porschev 2011-06-19
  • 打赏
  • 举报
回复

昨天回过你了啊。。

等号是把B的引用给了A,A和B指向同一个对象

CopyTo是把B完全复制一份给A,现在有了两个对象。。

用等号。。。。如果修改了A和B任何一个。。。他们两都会被修改。。。

他们的指向的是同一个
Icedmilk 2011-06-19
  • 打赏
  • 举报
回复
CopyTo之后又两个数组Object
赋值之后只有一个数组Object
这就是区别

最开始
myClasses1 -> Array object -> MyClass object
myClasses2 -> Array object -> MyClass object

如果用赋值运算:
myClasses1 -\
|-> Array object -> MyClass object
myClasses2 -/

如果用CopyTo:
myClasses1 -> Array object -> -\
|-> MyClass object
myClasses2 -> Array object -> -/

110,534

社区成员

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

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

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