C# Miért nem működik a Swap () függvényem?
public static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
public static void Swap<T>(T lhs, T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
Ha egy listában akarom az elemeket(osztálypéldányokat) cserélgetni, nincs a Swap-nak hatása. A ref-es verziót meg csak úgy engedi használni, ha csinálok új változókat, amiket egyenlővé teszek a lista elemekkel és az új változókat swappolom, de a listában ez akkor se jelenik meg.
Konkrétan amire kíváncsi vagyok, hogy hogy is vannak itt a referencia átadások? Mert úgy tudtam, hogy C#-ban minden osztálypéldányról minden paraméter átadásnál és egyenlőségnél másolat készül, vagyis csak egy fajta "pointer" adódik át. Az előző problémánál meg mégsem ez történik. El tudná magyarázni valaki, hogy is van ez?
Na most nem vagyok C# guru, de valamennyit tudok róla, és te meg ellentmondásba keveredsz önmagaddal.
"Mert úgy tudtam, hogy C#-ban minden osztálypéldányról minden paraméter átadásnál és egyenlőségnél másolat készül, vagyis csak egy fajta "pointer" adódik át. Az előző problémánál meg mégsem ez történik. El tudná magyarázni valaki, hogy is van ez?"
Ha másolat készül, akkor miért adódna pointer át? Ez a lényeg, pointer adódik át ÉRTÉK szerint. Tehát megkapod az lhs-t, ami egy pointer lesz egy T típusra. A pointerek értékét megváltoztatod, de ez nem befolyásolja a mutatott objektum értékét. Ezért nincs hatása.
A ref pontos jelentését nem tudom.
Ja szóval akkor ezek nem úgy működnek, mint a C++-os referenciák. Mert, hogy C++-ban a referencia egy névváltozat, itt meg mindegyiknek saját belső mutatója van. Jól értem?
... legalábbis most elkezdtem referenciákkal szórakozni C++-ban és ott működik a saját swap meg minden, akkor is ha referenciákat adok be paraméternek és a függvényen belül is a paraméterek referenciák.
Ezért írtam szándékosan pointert. Nem referencia, hanem pointer. Amit a C# referenciának hív az egy mutató. Vannak persze érték típusok (alaptípusok, structok), amiket ref kulcsszóval lehet noszogatni másfajta paraméterátadásra, de ez most nem ez a téma.
Tehát te mutatókat pakolgatsz a függvényedben, épp ahogy leírtam már korábban.
public static void Swap<T>(T lhs, T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
Ez a metódus semmit se csinál gyakorlatilag. Mármint semmi érezhetőt, ugyanis két paramétert adsz neki érték szerint, amikkel dolgozik, majd visszatér a hívóhoz egy nagy semmivel. Minden amit közben csinál, szépen elveszik amikor a metódus befejezi a futást.
Hogy ezt a működést elkerüld, vagy használod a 'ref' kulcsszót a paraméterátadáskor, vagy adsz valami visszatérési értéket a metódusnak, amivel később dolgozni lehet. A 'ref' működését úgy kell elképzelni, ahogy iostream is írta, tehát nem az objektum _értékét_ adod át a függvénynek, hanem az objektumra mutató pointert, ergo minden változtatás amit a függvény művel, magán az objektumon történik. A swap tipikus példa arra, amikor érdemes a 'ref', tehát a cím szerinti paraméterátadást használni.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, 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!