欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#易混淆知识点

程序员文章站 2022-06-11 14:41:28
...

C#易混淆知识点@Crystal

一、==与Equals的区别

代码实例:

 static void Main(string[] args)
        {
            object m1 =1 ;
            object m2 = 1;
            
            Console.WriteLine(m1==m2);
            Console.WriteLine(m1.Equals(m2));
            Console.Read();
}

运行结果为:C#易混淆知识点

直接的区别

  • = =比较的是栈内的内容,对于值类型而言,”==“比较的就是两个对象的值,除字符串(字符串类型是一个特殊情况)以外的引用类型比较的就是两个引用类型在栈内的地址
  • 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。

进一步加深理解

 static void Main(string[] args)
        {
            string str1 = "ZhangSan";
            string str2 = "ZhangSan";
            string str3 = new string(new char[] { 'z', 'h' });
            string str4 = new string(new char[] { 'z', 'h'});
            Console.WriteLine("str1 == str2  " + (str1 == str2).ToString());
            Console.WriteLine("str1 Equals str2  " + str1.Equals(str2));
          
            Console.WriteLine("str3 == str4 " + (str3 == str4).ToString());
            Console.WriteLine("str3 Equals str4 " + str3.Equals(str4));          
         
            Console.Read();
        }

运行结果:
C#易混淆知识点

二、typeof与GetType区别

代码实例:

 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();
        }

运行结果为:C#易混淆知识点

直接的区别

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