在研究equle ==两个对比方法时遇到的问题,引用类型没搞清楚,先问问值类型。
1、网上说值类型判断, equle 和 == 的结果都是对值是否相等进行判断,不存在引用类型的问题。那么结构体也算值类型,咋就不符合这个要求了恁。
2、还有,值类型传值都是深拷贝,我测试的结构体就可以相互影响?
1 struct MyStruct 2 { 3 public List<string> list; 4 public int Num; 5 public MyStruct(int a) 6 { 7 this.list = new List<string>(){"a"}; 8 Num = 1; 9 } 10 } 11 12 public Form1() 13 { 14 MyStruct ss = new MyStruct(1); 15 MyStruct hh = ss; 16 hh.list.Add("b"); 17 hh.Num = 3; 18 bool sh = ss.Equals(hh); 19 } 20
如果没有改变值的16、17行,那么equal为true.
如果改变了值,则false。不是说不能传值嘛。
1.结构是值类型.你说不是,请举例
2.深拷贝也没错。但是你要理解什么是堆,什么是栈。
还有这里。这一行“hh.Num = 3;”不要,你在看看equals是不是true
hh.list.Add("b");
hh.Num = 3;
equals 默认的实现是。遍历所有所有属性字段gethascode得出一个最终的hashcode
那您老的意思是,深拷贝,也只是将栈上的值类型和引用拷贝了,并不是堆上内容的拷贝?
@代码小兵的成长: 正确。你要深拷贝堆上的值。
简单做法,序列化,在反序列化。这样玩
@calvinK: 娘啊,世界观崩塌了又,唉,原来结构里面的引用类型和普通的引用类型没啥区别
@代码小兵的成长: 结构里面的引用类型 也还是在堆上的呀。
@calvinK: 多谢咯
换个东西
int a=3;
int b=a;
b=5;
b.Equals(a)...
你觉得呢?
还有不明白你所谓的不能传值是什么意思。
Equals方法本身可以看为就是比较两个对象栈上是不是一样,如果是值类型,那么就是比较其内容咯(值类型本身就在栈上),引用类型就是比较其栈上的地址。
不能传值的意思是说,既然结构体是值类型,那么ss 和 hh 就不能相互影响,可是我如果操作hh.list, ss.list也相互影响。
还有equal,我看文章,说的是==才是比较栈的内容,equal比较的是类型、地址、内容等所有的
@代码小兵的成长:你那个list在栈上只是一个地址啊,不管是你hh还是ss对其做了修改,都是修改同一地址上对应堆中的内容。
==这个对于引用类型可以这么说,但自定义值类型你不重载这个operator你怎么比较?
equals方法(排除string类型)默认就是比较栈上的玩意是不是一致的,不管是什么类型。
@Daniel Cai: equals方法(排除string类型)默认就是比较栈上的玩意是不是一致的,不管是什么类型。
这句话硬是是比较堆上的内容把
@Daniel Cai:
(排除string类型)默认就是比较栈上的玩意是不是一致的,不管是什么类型。
这句话应该是比较堆上的内容把
@代码小兵的成长:
http://kb.cnblogs.com/page/107604/