C#中的"="赋值运算是怎样运作的?

dfpgb 2009-08-17 11:56:42
深层复制?浅层复制?何种情况用何种复制?
如何控制?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public class CA
{
private int m_iCount;

public void setCount(int iT)
{
m_iCount = iT;
}

public int getCount()
{
return m_iCount;
}
}

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
CA a1 = new CA();
CA a2 = new CA();

a1.setCount(11111);
a2 = a1;
a2.setCount(22222);

MessageBox.Show(a1.getCount().ToString());//为什么a1的也变成了22222?如果不想让a1也变该怎么办?
MessageBox.Show(a2.getCount().ToString());

a1 = null;
MessageBox.Show(a2.getCount().ToString());//如果前面表示a2就是a1了的话,为什么这里a2仍然是可以使用的?
}
}
}
...全文
219 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
youdandan 2009-08-17
  • 打赏
  • 举报
回复
采用值类型传递,只会改变后来的值,原值不会改变
引用就相反了
wuyq11 2009-08-17
  • 打赏
  • 举报
回复
浅拷贝是指将对象中的所有字段逐字复制到一个新对象
深拷贝与浅拷贝不同的是对于引用字段的处理,深拷贝将会在新对象中创建一个新的对象和
原始对象中对应字段相同的字段
Object类的MemberwiseClone 方法进行浅表复制。
public CA Clone()
{
return (CA)this.MemberwiseClone();
}
a1.setCount(11111);
a2 = a1.Clone();
a2.setCount(22222);
a2=a1
a2其实为a1的引用,而不是副本,它们指向同一个对象。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lunasea0_0 的回复:]
对引用类型是附引用。
对值类型是深复制。
[/Quote]

值类型有深浅之说吗?
dfpgb 2009-08-17
  • 打赏
  • 举报
回复
非常感谢大家的帮助
现在我大概明白了
可是新的疑问又出来了
C#中声明的都是引用吗?像CA a1,a2.它们仅仅是个引用而不代表真实的对象?真实的对象是new出来的?
那如果我想实现下面的运作可以吗
CA a1 = new CA();
CA a2 = new CA();
a2 = a1;//我想不让a2这个引用指向a1所指向的对象,而是想让a2所指向的对象的内容被赋值为a1所指向的对象,该怎么做呢?
zhuangyao 2009-08-17
  • 打赏
  • 举报
回复
这跟深层或者浅层复制没有什么关系啊,这是有关引用类型的

a1.setCount(11111);//
a2 = a1;//a2指向的是a1的托管堆,
a2.setCount(22222);//这里调用的setCount是a1的方法,改变的当然也是a1的值
BATTLERxANGE 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dancingbit 的回复:]
C# codea2=a1;

关键就在于这里,这里不是对象的复制而是引用的复制。
[/Quote]
为什么6L说的又是对象?
6L原话:
a2 = a1; //a2指向 A1指向的对象1
wuyi8808 2009-08-17
  • 打赏
  • 举报
回复
            CA a1 = new CA();   // a1 指向一个新对象
CA a2 = new CA(); // a2 指向一个新对象

a1.setCount(11111);
a2 = a1; // a2 指向 a1 对象,两者指向同一个对象
a2.setCount(22222);

a1 = null; // a1 置为空,a2 还是原来指那个对象,并不影响
// 这里即使改为 a1 = new CA(),还是不影响 a2
dancingbit 2009-08-17
  • 打赏
  • 举报
回复
a2=a1;


关键就在于这里,这里不是对象的复制而是引用的复制
zhengqian529 2009-08-17
  • 打赏
  • 举报
回复
a2=a1只是浅度复制,复制了指向某个对象的指针,而并没有复制对象本身。
zhengqian529 2009-08-17
  • 打赏
  • 举报
回复
a2=a1,把a1,a2指向了同一个对象,当a2修改的时候,对象改变了,所以 a1的取值也变了。
a1单独指向null,并没有改变a2的对象。

结论是:
改变对象,所以指向这个对象的引用的值都会变化。
改变引用,并不能影响其它指向此对象的引用。
dancingbit 2009-08-17
  • 打赏
  • 举报
回复
关键在于理解引用自身的变化它所引用的对象的变化之间的区别。
zgke 2009-08-17
  • 打赏
  • 举报
回复
CA a1 = new CA();
//创建一个对象CA a1指向对象CA 暂时使用地址 1表示把
CA a2 = new CA();
//创建一个对象CA a2指向对象CA 暂时使用地址 2表示把

a1.setCount(11111); //改变1的数据
a2 = a1; //a2指向 A1指向的对象1
a2.setCount(22222); //改变2的数据

MessageBox.Show(a1.getCount().ToString());//为什么a1的也变成了22222?如果不想让a1也变该怎么办? 这个输出的确实是 对象1的值
MessageBox.Show(a2.getCount().ToString()); //还是对象1的值

a1 = null; //a1指向空 不是对象为空 ...
MessageBox.Show(a2.getCount().ToString());//如果前面表示a2就是a1了的话,为什么这里a2仍然是可以使用的 //a2还是指向1的


其实和 值类型一样的..只是复制了一个引用地址而已.

Hide1984 2009-08-17
  • 打赏
  • 举报
回复
UP
dancingbit 2009-08-17
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
CA a1 = new CA();
CA a2 = new CA();

a1.setCount(11111);
a2 = a1;//这里只是引用的复制,即a1这个引用自身而非它引用的对象复制到a2。
a2.setCount(22222);//此时a1与a2引用同一个对象

MessageBox.Show(a1.getCount().ToString());//为什么a1的也变成了22222?如果不想让a1也变该怎么办?
MessageBox.Show(a2.getCount().ToString());//这个是当然的了,本来就是同一个对象嘛

a1 = null;//现在a1不引用任何对象,但a2并不影响。
MessageBox.Show(a2.getCount().ToString());//如果前面表示a2就是a1了的话,为什么这里a2仍然是可以使用的?
}

关键在于理解引用自身的变化与它所引用的对象之间的变化的区别。
lunasea0_0 2009-08-17
  • 打赏
  • 举报
回复
对引用类型是附引用。
对值类型是深复制。
surlew 2009-08-17
  • 打赏
  • 举报
回复
UP
bj_kevin51 2009-08-17
  • 打赏
  • 举报
回复
迷糊。。。
dfpgb 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 yuanhuiqiao 的回复:]
只说一部分。c#中的类型分为值类型(简单类型(int,long等)、结构类型、枚举),引用类型(Class、string、数组、接口,Delegate)。
可能由于装箱机制的存在,感觉似乎是都以引用的形式存在,但他们的内存分派方式是不一样的,一个是栈,一个是堆。

[/Quote]
多谢!
yuanhuiqiao 2009-08-17
  • 打赏
  • 举报
回复
只说一部分。c#中的类型分为值类型(简单类型(int,long等)、结构类型、枚举),引用类型(Class、string、数组、接口,Delegate)。
可能由于装箱机制的存在,感觉似乎是都以引用的形式存在,但他们的内存分派方式是不一样的,一个是栈,一个是堆。
dfpgb 2009-08-17
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 dancingbit 的回复:]
你现在在.Net版的等级只能发最高100分的帖子。
[/Quote]
哦 多谢 呵呵
加载更多回复(8)

110,535

社区成员

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

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

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