C# 中Object的方法含义以及使用(详)

如下图是object中的方法

C# 中Object的方法含义以及使用(详)_第1张图片

上图来源于我阅读C#入门经典第8版的书本当中,图中明确标明方法的使用,以及含义。

Equals方法

  比较两个对象是否相等。在Object是所有的父类大家都知道,其中Object中方法Equals 有两种

object中内部方法代码的截图

C# 中Object的方法含义以及使用(详)_第2张图片

第一种静态的

静态通过对象直接点方法名调用 如下所示 (至于为什么没有写Object是因为Object类在我们类中已经隐式的继承了)

  PLS pLS = new PLS();
            PLS pLSs = pLS;
            Equals(pLSs, pLS);

当前的返回结果为 True 因为当您比较的,如果是引用类型的对象,则用于判断两个对象是否引用了同一个对象。

第二种虚方法(居然是虚方法,那肯定能重写) 

   public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }

不重写当然可以,使用变量名称点方法 Equals便好 (如下结果依旧会是 True)

   public class Program : Object
    {
        static void Main(string[] args)
        {
            PLS pLS = new PLS();
            PLS pLSs = pLS;
            Console.WriteLine(pLS.Equals(pLSs));
            ReadKey();
        }
      
    }

当前方法 Equals 总之记住 

  • 如果是引用类型的对象,则用于判断两个对象是否引用了同一个对象。

Equals 上面使用的是一个参数,且是非静态的虚方法能被重写,是使用参数名点出方法。这里使用同样是Equals但它是静态的两个参数签名的方法。

其中的含义于上面的非静态的方法Equals相同,其中就是当您比较的值为空引用那么返回的值就是True

   PLS pLS = new PLS();
            PLS pLSs = new PLS ();
          WriteLine( Equals(pLS, pLSs));//结果为false
                                        //ReferenceEquals("","");


            PLS pLS1 = pLS;
            WriteLine(Equals(pLS, pLS1));//结果为True
            Console.WriteLine(pLS1.Equals(pLS));//结果为True
            Console.WriteLine(Equals(null,null));//结果为True
            ReadKey();

如果您使用静态的Equals比较的为空引用,那么程序会报错: System.NullReferenceException:“未将对象引用设置到对象的实例。”

C# 中Object的方法含义以及使用(详)_第3张图片

ReferenceEquals 方法

C# 中Object的方法含义以及使用(详)_第4张图片

 和上面静态方法Equals很像效果几乎一致。

ToString方法

将对象转换为string类型,如果是引用类型得到的就是当前类型所在的命名空间

MemberwiseClone 方法

文章中的深度复制章节也有相关解释icon-default.png?t=N7T8https://blog.csdn.net/qq_71897293/article/details/134684612?spm=1001.2014.3001.5502

默认使用该方法是复制当前对象的内容返回,同对象类型的变量。我们称呼为复制,其中复制有深度复制 和浅度复制,如下我们使用方法Clone

  public class Program :Object
    {
        static void Main(string[] args)
        {
            PLS pLS = new PLS();
            pLS.MyProperty = 10;

           PLS newpLS= (PLS)pLS.Clone();
            Console.WriteLine(newpLS.MyProperty);//结果10
            ReadKey();
        }
    }
    public class PLS
    {
        public PLS() {}
        public int MyProperty { get; set; }
        private int myVar;
        public int MyPropertsy => myVar;
        public object Clone() => MemberwiseClone();
    }

默认将所有对象下的值进行了复制 ,且我更改其中的pLS 的属性MyProperty的值newpLS下的属性不会更改。但如果是引用一个类的属性可能出现问题 如下(问题:在更改其中的属性Count,两个对象的值都改变了 原因就是引用的同一个实例,上面属性没有问题是,虽然引用了相同的对象,但是在实际使用中也不会有什么问题。PL是一个对象实例可以说是复制指向了同一个类

 public class Program :Object
    {
        static void Main(string[] args)
        {
            PLS pLS = new PLS();
            pLS.MyProperty = 10;

           PLS newpLS= (PLS)pLS.Clone();
            newpLS.PL.Count = 100;
            Console.WriteLine(pLS.PL.Count);//结果100
            Console.WriteLine(newpLS.PL.Count);//结果100
            ReadKey();
        }
    }
    public class PLS
    {
        public PLS() { PL.Count = 10; }
        public int MyProperty { get; set; }
        public object Clone() => MemberwiseClone();
        public OP PL { get; set; } = new OP();
    }
    public class OP
    {
        public int Count { get; set; }
    }

解决问题就是浅度复制,上面被称呼为深度复制 

改变复制的方法,将复制的时候 PL的属性指向,不在是同一个类 ,而是创建一个新的类返回

   public object Clone()
        {
            PLS pLS = (PLS)MemberwiseClone();
            pLS.PL = new OP();
            return pLS;

        }

GetType方法

返回当前实例的类型,方法为非静态,GetType

Object下的GetType截图

使用示例场景:类型比较 如下情景 判断变量是否为 string类型 

 string k="S";
            k.GetType().ToString();//获取当前实例
            //GetType可以用作类型判断
            //示例
           if (k.GetType() == typeof(string))//判断是否为 string类型的值
            {
// code
            }

GetHashCode方法

        当您需要将对象存储在哈希表中时,可以使用 GetHashCode 方法来计算对象的哈希代码。哈希代码是一个数字,用于标识对象并在基于哈希的集合中插入对象。如果两个对象相等,则它们的哈希代码也必须相等。因此,如果您重写了 Equals 方法,则还应重写 GetHashCode 方法以确保对象相等性的一致性。

        在 C# 中,GetHashCode 方法的默认实现是返回对象的内部唯一标识符。但是,您可以重写此方法以返回您自己的哈希代码。

        简单来说GetHashCode 就是返回一个对象的哈希码(整数数值)可以用于储存在哈希表等数据结构中

举个例子:

public override int GetHashCode()
{
    return field1.GetHashCode() ^ field2.GetHashCode();
}

注意:

        此示例中的哈希代码生成方法可能会导致哈希冲突。因此,您应该根据您的对象的特定需求选择适当的哈希代码生成方法。

你可能感兴趣的:(C#,c#,开发语言)