如下图是object中的方法
上图来源于我阅读C#入门经典第8版的书本当中,图中明确标明方法的使用,以及含义。
比较两个对象是否相等。在Object是所有的父类大家都知道,其中Object中方法Equals 有两种
object中内部方法代码的截图
第一种静态的
静态通过对象直接点方法名调用 如下所示 (至于为什么没有写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:“未将对象引用设置到对象的实例。”
和上面静态方法Equals很像效果几乎一致。
将对象转换为string类型,如果是引用类型得到的就是当前类型所在的命名空间
文章中的深度复制章节也有相关解释https://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
Object下的GetType截图
使用示例场景:类型比较 如下情景 判断变量是否为 string类型
string k="S";
k.GetType().ToString();//获取当前实例
//GetType可以用作类型判断
//示例
if (k.GetType() == typeof(string))//判断是否为 string类型的值
{
// code
}
当您需要将对象存储在哈希表中时,可以使用 GetHashCode
方法来计算对象的哈希代码。哈希代码是一个数字,用于标识对象并在基于哈希的集合中插入对象。如果两个对象相等,则它们的哈希代码也必须相等。因此,如果您重写了 Equals
方法,则还应重写 GetHashCode
方法以确保对象相等性的一致性。
在 C# 中,GetHashCode
方法的默认实现是返回对象的内部唯一标识符。但是,您可以重写此方法以返回您自己的哈希代码。
简单来说GetHashCode 就是返回一个对象的哈希码(整数数值)可以用于储存在哈希表等数据结构中
举个例子:
public override int GetHashCode()
{
return field1.GetHashCode() ^ field2.GetHashCode();
}
注意:
此示例中的哈希代码生成方法可能会导致哈希冲突。因此,您应该根据您的对象的特定需求选择适当的哈希代码生成方法。