Contrariamente alle risposte qui, ho trovato (object) ==
più veloce di object.ReferenceEquals
. Quanto a quanto più veloce, molto trascurabile!
banco di prova:
So che avete bisogno controllo di uguaglianza di riferimento, ma sto tra cui metodo statico object.Equals(,)
nonché in caso di classi in cui la sua non sovrascritto.
Piattaforma: x86; Configurazione: accumulo di uscita
class Person {
}
public static void Benchmark(Action method, int iterations = 10000)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < iterations; i++)
method();
sw.Stop();
MsgBox.ShowDialog(sw.Elapsed.TotalMilliseconds.ToString());
}
prova:
Person p1 = new Person();
Person p2 = new Person();
bool b;
Benchmark(() =>
{
b = (object)p1 == (object)p2; //960 ~ 1000ms
b = object.ReferenceEquals(p1, p2); //~ 1250ms
b = object.Equals(p1, p2); //2100ms
b = EqualityComparer<Person>.Default.Equals(p1, p2); //~4000ms
}, 100000000);
Person p1 = new Person();
Person p2 = null;
bool b;
Benchmark(() =>
{
b = (object)p1 == (object)p2; //990 ~ 1000ms
b = object.ReferenceEquals(p1, p2); // 1230 ~ 1260ms
b = object.Equals(p1, p2); //1250 ~ 1300ms
b = EqualityComparer<Person>.Default.Equals(p1, p2); //~3100ms
}, 100000000);
Person p1 = null;
Person p2 = null;
bool b;
Benchmark(() =>
{
b = (object)p1 == (object)p2; //960 ~ 1000ms
b = object.ReferenceEquals(p1, p2); //1260 ~ 1270ms
b = object.Equals(p1, p2); //1180 ~ 1220ms
b = EqualityComparer<Person>.Default.Equals(p1, p2); //~3100ms
}, 100000000);
Person p1 = new Person();
Person p2 = p1;
bool b;
Benchmark(() =>
{
b = (object)p1 == (object)p2; //960 ~ 1000ms
b = object.ReferenceEquals(p1, p2); //1260 ~ 1280ms
b = object.Equals(p1, p2); //1150 ~ 1200ms
b = EqualityComparer<Person>.Default.Equals(p1, p2); //3700 ~ 3800ms
}, 100000000);
object.Equals(,)
chiamate ReferenceEquals
internamente e se non sono uguali sarebbe chiamare il Equals
metodo virtuale overriding della classe, e quindi si vede l'avviso la differenza di velocità.
I risultati sono stati coerenti nel Debug
configurazione troppo ...
Come sottolineato, l'accento dovrebbe essere sulla leggibilità/significatività/intento rivelando.
+1, hanno concordato la leggibilità. – JaredPar
Sono d'accordo che il cast per l'oggetto è confuso. Ci si può chiedere perché sia necessario il cast in ((oggetto) obj == null), non rendendosi conto che l'uguaglianza di riferimento si riduce in definitiva a (oggetto == oggetto). Inoltre, il confronto con null sembra implicitamente un confronto di riferimento, ma l'operatore tipizzato viene effettivamente scelto. – Triynko
Concordato sulla leggibilità, ma vedere la mia risposta sulle prestazioni. – nawfal