• 判断两个对象是否相同


    判断两个对象是否相同,关键是看这两个对象是否指向内存中的同一块内存。

    先看例子:

     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             #region 判断两个对象是否相同:看是否指向同一块内存
     6             Person p1 = new Person()
     7             {
     8                 Name = "张三",
     9                 Age = 18
    10             };
    11 
    12             Person p2 = new Person()
    13             {
    14                 Name = "张三",
    15                 Age = 18
    16             };
    17             #endregion
    18 
    19             Console.ReadKey();
    20         }
    21     }
    22 
    23     public class Person
    24     {
    25         public string Name { get; set; }
    26         public int Age { get; set; }
    27     }
    View Code
     1 class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             Person p1 = new Person()
     6             {
     7                 Name = "张三",
     8                 Age = 18
     9             };
    10 
    11             Person p2 = new Person()
    12             {
    13                 Name = "张三",
    14                 Age = 20
    15             };
    16             Console.ReadKey();
    17         }
    18     }
    19 
    20     public class Person
    21     {
    22         public string Name { get; set; }
    23         public int Age { get; set; }
    24     }

    调试--》窗口--》即时,分别输入&p1,&p2,发现两个对象的内存地址不一样,说明这是两个不同的对象,只是这两个对象存储的内容相同。如下:

    1 &p1
    2 0x0694ecc8
    3     *&p1: {0}
    4 &p2
    5 0x0694ecc4
    6     *&p2: {0}
    View Code

     案例二、

     1 Person p1 = new Person();
     2             p1.Name = "张三";
     3             p1.Age = 20;
     4 
     5             Person p2 = new Person();
     6             p2.Name = "张三";
     7             p2.Age = 20;
     8 
     9             Console.WriteLine(p1.Equals(p2));//false
    10             Console.WriteLine(p1==p2);//false
    11 
    12             string[] names1 = new string [] {"张三","李四","王五" };
    13             string[] names2 = new string[] { "张三", "李四", "王五" };
    14             Console.WriteLine(names1.Equals(names2));//false
    15             Console.WriteLine(names1 == names2);//false
    16 
    17             string str1 = new string(new char[] { '1','2','3'});
    18             string str2 = new string(new char[] { '1', '2', '3' });
    19             Console.WriteLine(str1.Equals(str2));//true
    20             Console.WriteLine(str1 == str2);//true
    View Code

    分别输出  false,false/false,false/true,true.

    通过上面第一个案例,我们知道equals和==都是比较对象的地址,所以前面两个都是false很好理解,为何变成string类型后就不对了呢?原因是,所有的对象都继承了object,而object对象都有equals方法,但是不同的对象实现不一样。string的equals方法,重新后是判断对象的内容是否相同。而字符串中==内部也是调用equals实现的。所以用equals或者==来判断两个对象是否相同不准确。永远准确的方法是 Object.ReferenceEquals();

    这里我们可以让案例二中的第一个例子输出true,只要在person类中重写equals方法就行了。代码如下:

     1  Person p1 = new Person();
     2             p1.Name = "张三";
     3             p1.Age = 20;
     4 
     5             Person p2 = new Person();
     6             p2.Name = "张三";
     7             p2.Age = 20;
     8 
     9             Console.WriteLine(p1.Equals(p2));
    10 
    11 
    12 
    13 
    14 public class Person
    15     {
    16         public string Name { get; set; }
    17         public int Age { get; set; }
    18 
    19         public override bool Equals(Object obj)
    20         {
    21             Person p = obj as Person;
    22             if (p != null)
    23             {
    24                 if (p.Name==this.Name&&p.Age== this.Age)
    25                 {
    26                     return true;
    27                 }
    28                 else
    29                 {
    30                     return false;
    31                 }
    32             }
    33             else
    34             {
    35                 return false;
    36             }  
    37         }
    38     }
    View Code

    输出true;

  • 相关阅读:
    [大数据相关] Hive中的全排序:order by,sort by, distribute by
    [mysql] Mysql数据分组GROUP BY 和HAVING,与WHERE组合使用
    【hadoop环境问题】namenode无法启动问题解决
    【java】Java.math.BigDecimal.subtract()方法实例
    利用 force index优化sql语句性能
    navicat连接远程数据库报错'client does not support authentication protocol requested by server consider ...'解决方案
    spark SQL学习(数据源之parquet)
    spark SQL学习(load和save操作)
    spark学习(RDD案例实战)
    spark学习12(Wordcount程序之spark-shell)
  • 原文地址:https://www.cnblogs.com/wesley168/p/6435161.html
Copyright © 2020-2023  润新知