如下图是object中的方法
上图来源于我阅读C#入门经典第8版的书本当中,图中明确标明方法的使用,以及含义。
Equals方法
比较两个对象是否相等。在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:“未将对象引用设置到对象的实例。”
ReferenceEquals 方法
和上面静态方法Equals很像效果几乎一致。
ToString方法
将对象转换为string类型,如果是引用类型得到的就是当前类型所在的命名空间
MemberwiseClone 方法
默认使用该方法是复制当前对象的内容返回,同对象类型的变量。我们称呼为复制,其中复制有深度复制 和浅度复制,如下我们使用方法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方法