• ==与Equals的作用


            string str1 = "Blackteeth";
                string str2 = str1;
                string str3 = "Blackteeth";
    
                Console.WriteLine("str1 == str2" + (str1 == str2));          //输出 true
                Console.WriteLine("str1.Equals(str2)" + (str1.Equals(str2)));`    //输出true
                Console.WriteLine("str1 == str3" + (str1 == str3));          //输出true
                Console.WriteLine("str1.Equals(str3)" + (str1.Equals(str3)));       //输出true
                Console.ReadKey();

    乍一看输出的都是true,==的作用都是一样的,其实不然。再看一个案例。

    public class TestClass
        {
          
        }
                TestClass t1 = new TestClass();
                TestClass t2 = t1;
                TestClass t3 = new TestClass();
    
                Console.WriteLine("t1 == t2" + (t1 == t2));            //输出true
                Console.WriteLine("t1.Equals(t2)" + (t1.Equals(t2)));      //输出true
                Console.WriteLine("t1 == t3" + (t1 == t3));            //输出false
                Console.WriteLine("t1.Equals(t3)" + (t1.Equals(t3)));      //输出false
                Console.ReadKey();

    为什么会出现这种“诡异”的情况呢?

    1.==如果比较的对象是值类型,实际上比较的是对象的内容。由于由于string是特殊的引用类型(新定义的对象内容如果与之前的对象内容个相同,CLR把新对象地址直接指向之前的地址),所以案例一输出的结果全是true

    2.==如果比价的对象是类类型,实际上比较的是对象的地址。由于案例二中t1,t2,t3是自定义的类类型。比较的是对象的地址,直接把t1赋值给t2,并没有为t2开辟新的内存空间,所以t1和t2指向的内存是同一块地址。而t3是new出来的对象,在堆开辟了一块新的内容空间,t3地址因此与t1不同,输出结果为false。

    3.Equals是C# 中所有类的基类Object的一个virtual方法,比较时如果没有重写,默认使用==操作符比较。

    总结:==比较的如果是值类型,比较的是对象的内容;如果比较的是类类型,比较的是对象的地址。

  • 相关阅读:
    FTP解决办法:服务器发回了不可路由的地址。使用服务器地址代替。
    隐藏显示终端的光标(shell echo,linux c printf)
    FTP服务2种工作方式详解,PORT方式和PASV方式,(即主动模式和被动模式)
    XP使用VNC远程桌面CentOS 6(原创,备忘)
    LINUX命令行技巧
    FTP服务器(vsftpd)配置随笔
    更快、更强 64位编程的三十二条军规
    MFC 程序入口和执行流程
    css实现居中
    treeview控件显示指定目录下的目录和文件
  • 原文地址:https://www.cnblogs.com/blackteeth/p/10156032.html
Copyright © 2020-2023  润新知