wiki:csharpequals
Last modified 3 years ago Last modified on 2014-10-01 12:54:57

C# ja vertailuoperaattori

Millä kaikille tuo == vertaa sisältöä ja mille viitteen samuutta?

on ylikuormitettavissa eli se riippuu tapauksesta, kuitenkin:

"By default, the operator == tests for reference equality by determining whether two references indicate the same object. Therefore, reference types do not have to implement operator == in order to gain this functionality. When a type is immutable, that is, the data that is contained in the instance cannot be changed, overloading operator == to compare value equality instead of reference equality can be useful because, as immutable objects, they can be considered the same as long as they have the same value. It is not a good idea to override operator == in non-immutable types."

Eli esimerkiksi merkkijonoille se on sisältövertailu.

Jos haluaa verrata kahta viitettä, täytyy käyttää Objectin staattista ReferenceEquals metodia.

Toki kääntäjä saattaa antaa esimerkiksi kahdelle eri merkkijonolle saman olioviitteen jos niiden sisältö on sama...

string s1 = "tes" + "t";
string s2 = "t" + "est";
Console.WriteLine( Object.ReferenceEquals( s1, s2 ) );

tulostaa true.

> Sitten esim
>
>  int [] t1 = {1,2,3};
>  int [] t2 = {1,2,3};
>  if ( t1.Equals(t2) ) ... ei toimi

Equalsia ei ole määritelty kokoelmien vertailuun (tähän ei ole mitään yksikäsitteisen hyvää keinoa). Tässä se vertaa viitettä (taulukko on objekti).

Lisäinfoa esim.