Több fordítási időben létező stringek miért lesznek ugyanazok a példányok?
PL:
str1 = "foo";
object str2 = "foo";
Ugyanazt tárolják de két külön string,akkor miért egyezik a referenciájuk?
Nem megy a fejembe ez miért false:
string str1 = "foo";
object str2 = "foobar".Substring(0, 3);
bool b = str1 == str2;
Console.WriteLine(b);
És ez miért true:
string str1 = "foo";
object str2 = "foo";
bool b = str1 == str2;
Console.WriteLine(b);





A fordító fordítási időben elvégzi, hogy azonos string literálokhoz azonos string obejtumok tartozzanak.
A "foobar".Substring(0, 3) esetében a Substring metódushívás visszatérési értékének előállítása (nem fordítási) hanem futási időben történik.
Így már fényesen süt a nap adtam zöldet.
Még annyit,hogy mi az a literál?
Mégsem értek pár dolgot.
"A fordító fordítási időben elvégzi, hogy azonos string literálokhoz azonos string obejtumok tartozzanak"
Azonos string objektumok alatt azt érted,hogy van több objektum amik ugyanarra a referenciára mutatnak vagy azt,hogy ezek memóriacímei megegyeznek?





A program szövegében direkt módon beleírt adat a literál.
Pl a 2 is egy literál.
Objektum alatt azt értettem amit objektumorientált programozáson értenek bocs nem voltam egyértelmű. Az hogy van object nevű típus az nem számít ebben az értelemben ahogy értettem.





C#-ban (Java-val ellentétben) == String esetén Equals-t hívja, tehát nem referenciákat hasonlítasz össze, hanem tartalmat. Ha referenciák alapján akarsz összehasonlítani két stringet, akkor a ReferenceEquals-t használd. Ettől függetlenül, igazad van abban, hogy a literál stringek ("ami idézőjelek között szerepel a kódban") referenciája megegyezik, mivel a CLR ezeket összerendeli (String interning).
Ami cifrává teszi a dolgokat az az "object-esített" stringgel végzett compare. Mert ebben az esetben az object Equals-a hívódik meg, amely alapértelmezetten a ReferenceEquals-t hívja meg.
Tanács: ha érték szerint akarsz összehasonlítani, végezd az Equals-szal.





"Tanács: ha érték szerint akarsz összehasonlítani, végezd az Equals-szal."
Bullshit.
Használjon nyugodtan ==-t, ugyanúgy érték szerint hasonlít össze, de cserébe sokkal olvashatóbb.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!