Domanda

A meno che una classe sostituisce specificamente il comportamento definito per oggetto, ReferenceEquals e == fare la stessa cosa ... riferimenti confrontare.

In setter di proprietà, ho comunemente usato il modello

private MyType myProperty;

public MyType MyProperty
{
    set
    {
        if (myProperty != value)
        {
            myProperty = value;
            // Do stuff like NotifyPropertyChanged
        }
    }
}

Tuttavia, nel codice generato da Entity Framework, la dichiarazione if è sostituito dal

    if (!ReferenceEquals(myProperty, value))

Utilizzando ReferenceEquals è più esplicito (come credo che non tutti i programmatori C # sanno che == fa la stessa cosa, se non ignorata).

C'è qualche differenza che mi sta sfuggendo tra le due se-varianti? Sono forse la contabilità per la possibilità che i progettisti possono avere POCO == override?

In breve, se ho == non override, sono io salvare utilizzando! = Anziché ReferenceEquals()?

È stato utile?

Soluzione

Ecco le diverse semantiche:

  • ReferenceEquals() deve essere utilizzato se si intende che gli oggetti sono esattamente gli stessi (controllo di identità).
  • object.Equals() deve essere utilizzato se si intendono gli oggetti hanno lo stesso valore (controllo di uguaglianza)
  • ==() deve essere utilizzata solo per i tipi immutabili. Quindi utilizzarlo per prova per l'uguaglianza.

Naturalmente le controparti Inversed hanno lo scopo di conseguenza.

Ecco una sintesi

Altri suggerimenti

== dovrebbe verificare se i punti di riferimento nella stessa posizione mentre i test ReferenceEquals per vedere se contengono gli stessi dati

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top