Kezdőoldal » Számítástechnika » Programozás » C#: Cím szerinti paraméter...

C#: Cím szerinti paraméter átadás?

Figyelt kérdés

Egy tömb elemeit akarom sorbarendezni egy void típusú metódusban. Épp ezért cím szerint szeretném átadni a tömböt, hogy ugyanazt a tömböt kapjam vissza, csak rendezve. C# úgy tudom erre a ref és az out használatos, de bármelyiket is próbálom, azt írja ki, hogy az ilyen paraméternek kötelező, hogy értéke legyen, holott én úgy tudtam, hogy az out-ot kifejezetten lehet nem-inicializált változóra is használni. Fontos lenne, hogy így legyen, mert különben a

VoidMetódus(OsztálytömbMetódus(x))

-t nem tudom meghívni. Akkor ez most hogy van?


Egyébként azt is hallottam, hogy az out-tal egy metódusból több visszatérési érték is kicsikarható. Ez pontosan hogy működik?



2016. nov. 29. 23:42
 1/9 anonim ***** válasza:

Nem legendáknak kell hinni, hogy mit hallottál, el kell olvasni a dokumentációt.

Egyébként meg semmilyen hókuszpókuszra nincs szükség, átadod a tömböt, mint paramétert, majd rendezed, utána rendezve lesz.

A cím szerinti paraméter átadás pont arra lenne jó, hogy egy másik tömböt kapj vissza hívás után.


A valódi jó válasz pedig az Array.Sort() függvény.

2016. nov. 30. 00:08
Hasznos számodra ez a válasz?
 2/9 A kérdező kommentje:

Félreértettük egymást, kétszer is. Egyrészt nem keresőalgoritmust kérdeztem, azt tudok magamtól is sokat.


Másrészt úgy értettem, hogy én ugyanazt a tömböt akarom visszakapni, csak az elemek benne már rendezve legyenek.


Ha érték szerint adnám át, akkor a metódusba bemenne x-rendezetlen tömb és kijönne y-rendezett tömb. De amit én akarok az az, hogy bemenjen x-rendezetlen tömb, és kijönne x-rendezett tömb, vagyis ugyanaz a tömb. Ezt pedig cím szerinti paraméter átadással érhetem el.


Már csak az lenne a kérdés ami, eddig is: mi ennek C#-ban a szintaktikája. Ennek és, annak, hogy több visszatérési értéke is legyen egy metódusnak szintén cím szerinti paraméter átadást használva.

2016. nov. 30. 00:21
 3/9 anonim ***** válasza:

"Félreértettük egymást, kétszer is. Egyrészt nem keresőalgoritmust kérdeztem, azt tudok magamtól is sokat."

Nem is mondtam semmilyen "keresőalgoritmust". Az Array.Sort() rendezi a tömböt. Pont. Egy sor.


"Másrészt úgy értettem, hogy én ugyanazt a tömböt akarom visszakapni, csak az elemek benne már rendezve legyenek.

Ha érték szerint adnám át, akkor a metódusba bemenne x-rendezetlen tömb és kijönne y-rendezett tömb. De amit én akarok az az, hogy bemenjen x-rendezetlen tömb, és kijönne x-rendezett tömb, vagyis ugyanaz a tömb. Ezt pedig cím szerinti paraméter átadással érhetem el."

Pont össze kevered az érték és cím szerinti paraméterátadást.

Ha írsz egy ilyet:

public void Sort(Object[] array)

akkor ez rendezi a tömböt, amit átadtál. Erről beszélek, hogy nem kell semmiféle hókuszpókusz, meg cím szerinti paraméterátadás.


"Ennek és, annak, hogy több visszatérési értéke is legyen egy metódusnak szintén cím szerinti paraméter átadást használva."

Újabb félreértés: egy függvénynek nem lehet több visszatérési értéke csak egy (illetve C# 7.0-ban már lehet, de ott még nem igazán tartunk).

Ami lehet, az a több kimenő paraméter, de ebben meg semmi magic nincs, egyszerűen fel kell sorolni őket egymás után, mintha bemenőek lennének, csak out vagy ref kulcsszóval.

Viszont ez egy tipikusan kerülendő tervezési minta, ritkán van rá valóban szükség.

2016. nov. 30. 00:34
Hasznos számodra ez a válasz?
 4/9 A kérdező kommentje:

Akkor azt mondom, hogy kell a hókuszpókusz, mert az egyetemen neheztelnek azért, ha olyan kód van a beadott programomban amit még egyáltalán nem is mutattak. És ha így félretesszük végre az Array.Sort()-ot, akkor mindjárt nem kevertem össze az érték és a cím szerinti paraméterátadást:


"Érték szerinti: a paraméterként megadott változóról másolat készül, a metódusban ezzel a másolattal dolgozunk. Ha a metódusban megváltoztatjuk a paraméter értékét, az az eredeti változóra nincs hatással, a hívó környezetben nem érvényesül a módosítás.

Cím szerinti: egy referenciát adunk át a paraméterként megadott változóra. A változóról nem készül másolat, tehát ha a metódusban megváltoztatjuk a paraméter értékét, akkor ez a módosítás a hívó környezetbeli változóra is érvényes lesz."


De legalább a másik kérdésemre kaptam választ, azt meg tudom köszönni.

2016. nov. 30. 01:09
 5/9 anonim ***** válasza:
A tömb az referenciatípus így ha egy tömböt át adsz egy függvény paraméterének,akkor a függvény paraméterébe is ugyanaz a referencia kerül így ha megváltozik akkor változik függvényen kívül is szal nem kell ide out meg ref.
2016. nov. 30. 01:42
Hasznos számodra ez a válasz?
 6/9 anonim ***** válasza:
De ha ehhez a paraméterhez ha egy új példány referenciáját rendeled akkor ez már egy olyan tömb lesz melynek a referenciája nem egyezik azzal amit paraméterül adtál a függvényednek. De ha te azt akarod,hogy ebben az esetben változzon a paraméterül adott tömböd ugyanazzá a referenciát tartalmazó tömbé akkor kell használnod az out,ref kulcsszavakat.
2016. nov. 30. 01:46
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:
Köszönöm!
2016. nov. 30. 01:53
 8/9 anonim ***** válasza:

Az Array.Sort() függvényt, akit egyetemen tanítanak prog1-ezni nem biztos, hogy használhatja, mivel éppen azt kell megtanulnia, hogy ezt hogy kell LINQ nélkül. Mivel elkezd pl. Javazni, Phpzni, ne adj' isten mikrovezérlőre (mai divatos nevén IoT) C-ben dolgozni, akkor nem lesz Array.Sort(); Vagy _array.OrderBy(x => x.PropertyName).ToArray();


A kérdező kérdésére válaszolva:

C#-ban cím szerint változót a ref-fel kell átadni. A ref-fel átadott változónak kötelező értékének lennie (ami lehet null), és a függvény hívásakor is ref-fel kell jelezni.


Az out arra szolgál, hogy több kimeneti paramétere legyen egy függvénynek, ilyenkor a függvény lefutásakor minden esetben értéket kell adni az out paramétereknek is. Az out paraméternek írhatónak kell lennie. (Nem readonly mező vagy lokális változó).


Out, illetve Ref nem állítható rá Property-re, csak mezőre. E mellett lambda kifejezésnek, és aszinkron metódusnak nem lehet out vagy ref paramétere, mivel ezekben az esetekben a pointerek helyes átadása nem megoldott a C# nyelvben.


Ha cím szerint akarsz átadni, akkor úgy kell meghívnod a metódusod, hogy:


int[] _array = OsztálytömbMetódus(x);

VoidMetódus(ref _array);

// Array itt rendeződik

2016. nov. 30. 20:54
Hasznos számodra ez a válasz?
 9/9 anonim ***** válasza:

Birom, amikor mindenki magyarázza a tudását... ...és összevitatkoznak olyan dolgokon, amiket egyszerűen meg lehet találni:


[link]


(Kár, hogy manapság már csak azt nem tanítják az egyetemen, hogy "Keresés a Google kulcsszavas keresővel", de lehet, hogy ez egy speciálkollégium, ami nem kötelező...)


[link]

2016. dec. 1. 14:54
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!