Это operator overload
(из ==, а не метод перегрузки ReferenceEquals
), чтобы проверить, если два экземпляра типа Shop
имеет равное ссылки (то есть, относятся ли они к один и тот же адрес памяти).
bool result = shop1 == shop2; //shop1 and shop2 are of type Shop
При объявлении ==
оператора, то необходимо будет также перегружать его соответствия (или счетчик) оператора !=
:
public static bool operator ==(Shop lhs, Shop rhs) {
if (Object.ReferenceEquals(lhs, null)) { //Check if the left-hand-side Shop is null
if (Object.ReferenceEquals(rhs, null)) {
return true; //both are null, equal reference
}
return false; //lhs is null, but rhs is not (not equal reference)
}
return lhs.Equals(rhs); //lhs is not null, thus can call .Equals, check if it is Equals to rhs
}
public static bool operator !=(Shop lhs, Shop rhs) { //the opposite operator
if (Object.ReferenceEquals(lhs, null)) {
if (Object.ReferenceEquals(rhs, null)) {
return false;
}
return true;
}
return !lhs.Equals(rhs);
}
Также стоит отметить, что Object.ReferenceEquals(lhs, null)
используется вместо lhs == null
как второй приведет к другой перегрузке ==
, вызываемой до infinite recursion, которая вызывает StackOverflowException
.
Они используются как это:
Shop shop1 = new Shop();
Shop shop2 = new Shop();
bool result = shop1 == shop2; //this will return false, since lhs and rhs referring to two different memory address
shop2 = shop1;
result = shop1 == shop2; //this will return true, referring to the same memory location
shop1 = null;
shop2 = null;
result = shop1 == shop2; //this will return true, both are null
Понимая это, вы могли бы даже создать что-то вроде этого:
public struct MyCrazyInt{ //this will reverse the result of + and -
private int Value { get; set; }
public MyCrazyInt(int value) :this() {
Value = value;
}
public bool Equals(MyCrazyInt otherCrazy) {
return this.Value != otherCrazy.Value; //reverse this result
}
public static MyCrazyInt operator +(MyCrazyInt lhs, MyCrazyInt rhs) {
int lhsVal = lhs.Value;
int rhsVal = rhs.Value;
return new MyCrazyInt(lhsVal - rhsVal); //note that direct lhs-rhs will cause StackOverflow
}
public static MyCrazyInt operator -(MyCrazyInt lhs, MyCrazyInt rhs) {
int lhsVal = lhs.Value;
int rhsVal = rhs.Value;
return new MyCrazyInt(lhsVal + rhsVal); //note that direct lhs+rhs will cause StackOverflow
}
public override string ToString() {
return Value.ToString();
}
}
И затем использовать его как этот
MyCrazyInt crazyInt1 = new MyCrazyInt(5);
MyCrazyInt crazyInt2 = new MyCrazyInt(3);
MyCrazyInt crazyInt3 = crazyInt1 - crazyInt2; //this will return 8
crazyInt3 = crazyInt1 + crazyInt2; //this will return 2
'Object. ReferenceEquals' проверяет, равны ли ссылки ...;) - Другими словами, он проверяет, является ли объект * точно таким же объектом *, в терминах физического m emory адрес. – Rob
Возможный дубликат [C# .Equals(), .ReferenceEquals() и == operator] (http://stackoverflow.com/questions/3869601/c-sharp-equals-referenceequals-and-operator) – Rohit
Поскольку == оператор класса Shop перегружен, код избегает его использования для проверки параметров для нулевой ссылки. if (lhs == null) приведет к бесконечной рекурсии, и приложение просто потерпит крах при исключении переполнения стека. –