c语言中的运算符,C#中的Equals() 和运算符 ==

关于这两个东西的相似就没什么好说的了。他们在本质上有不同的。
总结起来是
==比较的是托管栈当中的内容,Equals()比较的是托管堆当中的内容。
要讲这个就得回归到C#中一个非常非常重要的内容当中,值类型与引用类型。其实第一次看值类型与引用类型的时候就理解这两个有什么差别和异同了。但是在之后的不断学习实践中有太多的内容又是和这个知识点有着密切关系。失常感觉这个简单的东西自己理解的还是不够深刻。
C#中的类型有两种一种叫值类型,另一种叫引用类型。
具体的分类也很好记忆
值类型包括 所有数字数据类型(int ,double等等)、BooleanCharDate、所有结构,即使其成员是引用类型(这个是结构与类的区别之一)、枚举
引用类型包括 String  所有数组,即使其元素是值类型 类类型 委托
其中烦人的是String类型,C#在很多地方会把Srting弄得和值类型很像。但这高级的货就是个引用类型
这只是分类,值类型和引用类型的差别在下面的图里
值类型与引用类型c语言中的运算符,C#中的Equals() 和运算符 ==
这个图是在丑陋(这个不是重点)
这里的栈和堆在DOTNET的条件下都是指托管栈和托管堆
栈的大小是有限制的,你开得太多会照成栈溢出。(在C/C++下得数组没法建的很大)
所以呢对于比较大坨的数据类型采用了图中的方式存放。把实体放在堆中,然后栈里面只放堆的地址。
应该不难理解,很多语言都是这样处理的。如果像C++保留指针结构的话应该更好理解图的内容
那比较小托的东西直接放在栈里面就好了,访问的时候速度还快一点。
小坨的就是值类型,大坨的就是引用类型。
虽然也可以把定义各类结构,然后再里面开一个巨大的东西把他弄得很大。不过没人会要那样吧。
 
现在说回来Equals()和==的事
==比较的是托管栈当中的内容,Equals()比较的是托管堆当中的内容。
写一些代码来实践一下
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5:  
6: namespace TestEquals
7: {
8: class test
9: {
10: public int member;
11: public test(int member)
12: {
13: this.member = member;
14: }
15: }
16: class Program
17: {
18: static void Main(string[] args)
19: {
20: //值类型
21: int i1 = 10;
22: int i2 = 10;
23: Console.WriteLine("{0}", i1 == i2);
24: Console.WriteLine("{0}", i1.Equals(i2));
25:  
26: //引用类型
27: test t1 = new test(10);
28: test t2 = t1;
29: Console.WriteLine("{0}", t1 == t2);
30: Console.WriteLine("{0}", t1.Equals(t2));
31:  
32: test t3 = new test(10);
33: test t4 = new test(10);
34: Console.WriteLine("{0}", t3 == t4);
35: Console.WriteLine("{0}", t3.Equals(t4));
36: object o1 = 10;
37: object o2 = 10;
38: Console.WriteLine("{0}", o1 == o2);
39: Console.WriteLine("{0}", o1.Equals(o2));
40:  
41: Console.ReadKey();
42: }
43: }
44: }
Tags:  c语言的运算符 c运算符优先级 c运算符 c语言运算符 c语言中的运算符

延伸阅读

最新评论

发表评论