码迷,mamicode.com
首页 > Windows程序 > 详细

C#中易混淆的知识点(一)

时间:2017-04-09 12:24:03      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:技术   obj   system   实例   .com   http   msdn   blank   void   

一、== 与Equals()的区别:

1、实例:

  代码:

static void Main(string[] args)
{
object m1 =1 ;
object m2 = 1;

Console.WriteLine(m1==m2);

Console.WriteLine(m1.Equals(m2));
Console.Read();
}

 

代码运行结果显示:技术分享

 

 

问题:同样是Object对象的比较,为何用“==”比较是false,而用“Equals()”比较是false

2、解释:

对于结果为什么是这样的呢?这主要涉及到==与Equals方法的区别的,再讲两者的区别前,大家首先要明确——C#中有两种不同的相等:引用相等和值相等。值相等意味着两个对象保护相同的值,例如,两个值为1的整数就具有值相等性;引用相等意味着要比较的不是两个对象,而是两个对象的引用,且两者引用的是同一个对象。若要检查引用相等性,应使用 ReferenceEquals。若要检查值相等性,请使用 Equals(详细内容可以参考:http://msdn.microsoft.com/zh-cn/library/ms173147(v=vs.90).aspx )。下面就看看它们直接的区别:

    • ==比较的是栈内的内容,对于值类型而言,”==“比较的就是两个对象的值,除字符串(字符串类型是一个特殊情况)以外的引用类型比较的就是两个引用类型在栈内的地址
    • Equals方法是定义在Object中的虚方法,用来比较两者引用对象的值是否相等,.NET中类型就都可以重写Equals方法,例如,在.NET中string类型就重写了Equals方法,用于比较两个字符串的值是否相等,而不是字符串引用是否相等。

    有了上面的理论基础,下面就具体分析上面程序为什么会是那样的结果:

    1. 首先m1,m2都是引用类型,当执行m1==m2操作时,比较的是m1与m2在栈内地址的值是否相等,即比较的是引用,因为m1和m2指向的是托管堆中1是不同的地址(这点大家可以通过在debug状态下内存窗口中查看),所以得到的结果就自然是false
    2. 对于m1.Equals(m2)比较的是m1与m2引用的值是否相等,因为它们都是引用托管堆中1,它们地址不等,但是值是相等的,都是1,所以返回为true。

二、typeof与GetType()的区别:

1、实例:

 代码:

static void Main(string[] args)
{
object m1 = 1;
object m2 = 1;
// ValueType是引用类型,因为它是类,所以返回为false
Console.WriteLine(typeof(ValueType).IsValueType);
Console.WriteLine(m1.GetType().IsValueType);
Console.Read();
}

代码运行显示结果:技术分享

2、解释:

要想弄明白上面的运行结果,首先我们应该理解typeof与GetType的区别(之前我认为两个的都是一样的,这是一个误区),具体的区别为:

      • typeof  是运算符,而 GetType() 是方法
      • typeof 获得类型的System.Type对象,GetType()获得当前实例的Type,
      • GetType()是基类System.Object的方法,只有建立了一个实例之后才能够被调用
      • typeof的参数只能是int, string, class,自定义类型,不能为具体实例,否则编译器会报错

             

C#中易混淆的知识点(一)

标签:技术   obj   system   实例   .com   http   msdn   blank   void   

原文地址:http://www.cnblogs.com/wenjieblog/p/6684216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!