Если текущий экземпляр является ссылочным типом, Equals(Object) метод проверяет равенство ссылок, а вызов Equals(Object) метода эквивалентен вызову ReferenceEquals метода. Равенство ссылок означает, что сравниваемые объектные переменные ссылаются на один и тот же объект.
По умолчанию два операнда ссылочного типа, отличные от записи, являются равными, если они ссылаются на один и тот же объект.
//String(это ссылочный тип, но, как я понял, у него метод Equals и оператор == переопределены):
//Equals: сравнивает значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает значения
//Значимые примитивные типы:
//Equals: сравнивает значения и тип; int - является потомком object, поэтому при сравнении с объектом типа object - тип не учитывается, или же просто при сравнении в ТАКОМ случае объектов значимого и ссылочного типа сравниваются только значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает значения, но если сравниваются объект значимого примитивного типа и объект типа object с таким же значением, то сравнение и применение -- невозможно
//object:
//При примитивном значимом типе:
//Equals: сравнивает значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает ссылки
//При String:
//Equals: сравнивает значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает значения
}
}
class A
{
public string Name { get; set; }
public A(string name) => Name = name;
public A()
{
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
class B : A
{
public int Age { get; set; }
public B(string name, int age) : base(name) => Age = age;
public B()
{
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
struct A2
{
public int X { get; }
public int Y { get; }
public int Z { get; }
public A2(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
struct B2
{
public int X { get; }
public int Y { get; }
public int Z { get; }
public B2(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
}
//String(это ссылочный тип, но, как я понял, у него метод Equals и оператор == переопределены):
//Equals: сравнивает значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает значения
//Значимые примитивные типы:
//Equals: сравнивает значения и тип; int - является потомком object, поэтому при сравнении с объектом типа object - тип не учитывается, или же просто при сравнении в ТАКОМ случае объектов значимого и ссылочного типа сравниваются только значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает значения, но если сравниваются объект значимого примитивного типа и объект типа object с таким же значением, то сравнение и применение -- невозможно
//object:
//При примитивном значимом типе:
//Equals: сравнивает значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает ссылки
//При String:
//Equals: сравнивает значения
//ReferenceEquals: сравнивает ссылки
//==: сравнивает значения
}
}
class A
{
public string Name { get; set; }
public A(string name) => Name = name;
public A()
{
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
class B : A
{
public int Age { get; set; }
public B(string name, int age) : base(name) => Age = age;
public B()
{
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
struct A2
{
public int X { get; }
public int Y { get; }
public int Z { get; }
public A2(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
struct B2
{
public int X { get; }
public int Y { get; }
public int Z { get; }
public B2(int x, int y, int z)
{
X = x;
Y = y;
Z = z;
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
}
}