2008-10-06 11 views
5
List<tinyClass> ids = new List<tinyClass(); 
ids.Add(new tinyClass(1, 2)); 

bool b = ids.IndexOf(new tinyClass(1, 2)) >= 0; //true or false? 

Jeśli porównuje pod względem wartości, powinien powrócić true; jeśli przez odniesienie, zwróci false.
Jeśli porównuje się przez odniesienie i robię tinyClass a struct - czy to będzie miało znaczenie?Czy Lista <>. IndexOf porównać według referencji lub wartości?

+0

Albo uruchomić przykładowy kod i sprawdź wynik;) – OregonGhost

Odpowiedz

16

Od MSDN:

Ta metoda określa równość użyciu domyślnego porównywarka równości EqualityComparer <T> .Default dla T, typ wartości w liście.

Te domyślne sprawdza własności czy typ T implementuje interfejs rodzajowe System.IEquatable <T> a jeśli tak zwraca EqualityComparer <T> że używa tej realizacji. W przeciwnym przypadku zwracany jest EqualityComparer <T> który wykorzystuje nadpisania z Object.Equals i Object.GetHashCode dostarczone przez T.

Wydaje się, że wykorzystuje się metodę równymi ile przechowywane klasy realizuje > interfejs IEquatable < T.

1

To zależy od implementacji obiektu .Equals (..). Domyślnie dla obiektu porównywane są odniesienia. Jeśli zmienisz go na struct, to wierzę, że oceniłoby to prawda w oparciu o równość prywatnych członków, ale byłoby jeszcze bardziej programowo prawidłowe wdrożenie IEquatable.

2

Dla klasy, z domyślną implementacją równań - będzie porównywać przez odniesienie.

Jeśli zmienisz go na tinyStruct, to porówna go według wartości.

0

to również może być związane z której klasy lub instancji struktura jest przechowywane w postaci listy, z powodu elemencie równa realizacja opiera się na wartościach równości

Powiązane problemy