È un operator overload
(di ==, non metodo sovraccarico ReferenceEquals
) per verificare se due istanze di tipo Shop
è di uguale riferimento (cioè, se si riferiscono a lo stesso indirizzo di memoria).
bool result = shop1 == shop2; //shop1 and shop2 are of type Shop
Quando si dichiara ==
operatore, vi sarà anche richiesto di sovraccaricare il suo corrispondente (o contro) Operatore !=
:
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);
}
Vale anche la pena notare che Object.ReferenceEquals(lhs, null)
è usato al posto del lhs == null
come il secondo porterà a un altro sovraccarico ==
chiamato fino al infinite recursion che causa StackOverflowException
.
Essi sono utilizzati in questo modo:
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
Capire questo, si potrebbe anche creare qualcosa di simile:
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();
}
}
e quindi utilizzarlo come questo
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
'oggetto. ReferenceEquals' controlla se i riferimenti sono uguali ...;) - In altre parole, controlla se l'oggetto è lo * stesso oggetto *, in termini di m fisico indirizzo di memoria. – Rob
Possibile duplicato di [C# .Equaliti(), .ReferenceEquals() e == operatore] (http://stackoverflow.com/questions/3869601/c-sharp-equals-referenceequals-and-operator) – Rohit
Dal momento = l'operatore della classe Shop è sovraccarico, il codice evita di usarlo per testare i parametri per riferimento null. if (lhs == null) causerebbe una ricorsione infinita e l'app si arresterebbe semplicemente con un'eccezione di overflow dello stack. –