Kezdőoldal » Számítástechnika » Programozás » C# Miért nem működik a Swap...

C# Miért nem működik a Swap () függvényem?

Figyelt kérdés

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?



2013. aug. 8. 11:10
 1/6 iostream ***** válasza:

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.

2013. aug. 8. 11:33
Hasznos számodra ez a válasz?
 2/6 A kérdező kommentje:
Na rosszul fogalmaztam, csak nem lehet utólag javítani. Szal elvileg C#-ban pár alaptípust leszámítva minden referenciaként működik. Ha osztálypéldányt adunk át paraméterként, akkor nem érték szerint adódik át, hanem úgy mint C++-ban a referencia. Azt nem értem, hogy itt a lista elemeknél mi az ami miatt ez nem így van.
2013. aug. 8. 11:40
 3/6 anonim ***** válasza:
Itt a függvény belső változóinak (amik referenciákat tárolnak) értékeit cseréled meg. Semmi mást, ezért nincs kívül hatása.
2013. aug. 8. 12:41
Hasznos számodra ez a válasz?
 4/6 A kérdező kommentje:

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.

2013. aug. 8. 13:24
 5/6 iostream ***** válasza:
100%

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.

2013. aug. 8. 13:42
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:

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.

2013. aug. 9. 11:14
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!