首页 新闻 会员 周边 捐助

C# Struct是值类型的问题

0
悬赏园豆:10 [已解决问题] 解决于 2016-11-22 15:39

  在研究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。不是说不能传值嘛。

代码小兵的成长的主页 代码小兵的成长 | 菜鸟二级 | 园豆:303
提问于:2016-11-22 11:43
< >
分享
最佳答案
0

1.结构是值类型.你说不是,请举例

2.深拷贝也没错。但是你要理解什么是堆,什么是栈。

还有这里。这一行“hh.Num = 3;”不要,你在看看equals是不是true

hh.list.Add("b");
hh.Num = 3;

equals 默认的实现是。遍历所有所有属性字段gethascode得出一个最终的hashcode

收获园豆:10
czd890 | 专家六级 |园豆:14488 | 2016-11-22 13:35

那您老的意思是,深拷贝,也只是将栈上的值类型和引用拷贝了,并不是堆上内容的拷贝?

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2016-11-22 14:50

@代码小兵的成长: 正确。你要深拷贝堆上的值。

简单做法,序列化,在反序列化。这样玩

czd890 | 园豆:14488 (专家六级) | 2016-11-22 14:57

@calvinK: 娘啊,世界观崩塌了又,唉,原来结构里面的引用类型和普通的引用类型没啥区别

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2016-11-22 14:58

@代码小兵的成长: 结构里面的引用类型 也还是在堆上的呀。

czd890 | 园豆:14488 (专家六级) | 2016-11-22 14:59

@calvinK: 多谢咯

代码小兵的成长 | 园豆:303 (菜鸟二级) | 2016-11-22 15:39
其他回答(1)
0

换个东西

int a=3;

int b=a;

b=5;

b.Equals(a)...

你觉得呢?

 

还有不明白你所谓的不能传值是什么意思。

Equals方法本身可以看为就是比较两个对象栈上是不是一样,如果是值类型,那么就是比较其内容咯(值类型本身就在栈上),引用类型就是比较其栈上的地址。

Daniel Cai | 园豆:10424 (专家六级) | 2016-11-22 13:36

不能传值的意思是说,既然结构体是值类型,那么ss 和 hh 就不能相互影响,可是我如果操作hh.list, ss.list也相互影响。

还有equal,我看文章,说的是==才是比较栈的内容,equal比较的是类型、地址、内容等所有的

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2016-11-22 14:49

@代码小兵的成长:你那个list在栈上只是一个地址啊,不管是你hh还是ss对其做了修改,都是修改同一地址上对应堆中的内容。

==这个对于引用类型可以这么说,但自定义值类型你不重载这个operator你怎么比较?

equals方法(排除string类型)默认就是比较栈上的玩意是不是一致的,不管是什么类型。

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-11-22 16:01

@Daniel Cai: equals方法(排除string类型)默认就是比较栈上的玩意是不是一致的,不管是什么类型。

这句话硬是是比较堆上的内容把

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2016-11-25 10:06

@Daniel Cai: 

(排除string类型)默认就是比较栈上的玩意是不是一致的,不管是什么类型。

这句话应该是比较堆上的内容把

支持(0) 反对(0) 代码小兵的成长 | 园豆:303 (菜鸟二级) | 2016-11-25 10:06

@代码小兵的成长: 

http://kb.cnblogs.com/page/107604/

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-11-25 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册