Kezdőoldal » Számítástechnika » Programozás » C# programnyelvbe hogy lehet...

C# programnyelvbe hogy lehet saját magam által készített osztály pointer-öket használni?

Figyelt kérdés

Tényleges pointereket csak az alap típusokkal lehet csinálni unsafe blokk segítségével. Ez szép, jó, hurrá. Örüljünk.


De nekem nem alap tagból kéne pointer. Hanem egy általam készített osztályból. Gondoltam ott a ref... Gondoltam. De csak blokkokba lehet használni, mondotta az IDE, majd aláhúzta pirossal. Nekem meg ugye osztály szintű adattagként lenne rájuk szükségem.


Mit lehet ilyenkor csinálni? Csak pakoljam bele simán egy megfelelő típusu változót, majd bízzam rá a compiler-re? Őszintén ezt nem igazán csinálnám, mert nekem kötelezően pointer-re lenne szükségem, mert ugye az osztály, amihez kéne a pointer tartalmaz egy 65536 elemű tömböt, amit nem igazán szeretném ha lemásolna...


Meg jó lenne, ha ahhoz a pointer-höz publikus metódusokon keresztül hozzá férne a külvilág. Azaz tudná írni is és olvasni is.


Valakinek valami ötlet? C++ és C nyelveken a ponter-özés olyan könnyen megy, mint az ágybavizelés... Persze itt...


És ezt kötelezően C# nyelven kell megvalósítanom.


A hasznos válaszokat előre köszönöm.


2020. szept. 4. 20:52
1 2
 1/11 anonim ***** válasza:
67%
Pedig nem fogod megvalósítani, mert mégha menne is, a garbage collector úgy feltakarítja, mint a franc, ugyanis nem nézi, hogy mutat objectre pointer vagy sem.
2020. szept. 4. 21:18
Hasznos számodra ez a válasz?
 2/11 anonim ***** válasza:
100%

A C#-ban vannak referencia és érték típusok. Előbbibe tartozik minden általad írt osztály, tömbök, adatszerkezetek, stb. A referenciatípusok majdnem úgy működnek, mint a pointerek: ha függvényhívás során átadod, vagy másik változóba lemásolod, akkor csak a referencia másolódik le. Így ha függvénynek átadsz egy nagy elemszámú tömböt, akkor annak csak a referenciáját másolja le. Emiatt tudod függvényben módosítani az átadott objektumokat. Ezek tekintetében szerintem nincs szükséged pointerre.

Néhány szó a ref kulcsszóhoz: erre általában akkor van szükség, amikor a nem szeretnénk, hogy az objektumra mutató referencia lemásolódjon egy függvényhívás során. Megfigyelheted, hogy bár olyat tudsz, hogy egy átadott objektumot függvényen belül módosítasz, de olyat már nem, hogy ezt újra létrehozd. Ilyenkor ugyanis a lemásolt referenciamutatóra hozol létre egy új objektumot, nem pedig az eredetire. Ha tehát olyat szeretnél, hogy függvényen belül hozod létre azt az objektumot, aminek a 'változója' paraméterben érkezik, akkor használj refet. Minden más esetben a referenciatípus tökéletesen pointerként viselkedik mindenféle fejfájás nélkül. Unsafe kódot nem nagyon kellene használni.

Érték típusok esetén érdemes figyelni a nagy másolgatásokra. Ezek könnyen felismerhetőek, ugyanis default inicializálódnak, és nem vehetnek fel null értéket (mivel nem egy referencia). Ilyen pl a struct.

2020. szept. 4. 21:27
Hasznos számodra ez a válasz?
 3/11 A kérdező kommentje:
Hát rendben. Akkor inkább a fejfájás nélküli megoldást választom. Csak nem kellemes, mikor nem tudom mi és merre van a memóriába... Ahogy azt sem, hogy teleszemetelje a memóriát felesleges másolatokkal. :/
2020. szept. 4. 21:31
 4/11 anonim ***** válasza:
Akkor nem egészen érted. Lehet rosszul fogalmaztam meg. Ha létrehozol egy objektumot, az referenciatípus lesz. Az ugyanúgy viselkedik, mint a pointer. A pointer-t is lemásolod függvényhívás során, de csak azt, nem pedig a mögöttes objektumot. Ha van a programod elején egy 10000 elemű tömböd, amit átadsz 100 osztálynak, akkor a tömb csak egyszer lesz a memóriában.
2020. szept. 4. 21:36
Hasznos számodra ez a válasz?
 5/11 A kérdező kommentje:
Tudom. És meg is értettem. És tudom hogy pointer lesz belőle, csak na. Nekem furcsak ez a C++ és C után hogy nem én hozom létre őket, és nem én szabadítom fel.
2020. szept. 4. 21:39
 6/11 anonim ***** válasza:
100%
Natív c++ kódot tudsz futtatni C#-ban, ha ennyire fura vagy, hogy nem bízol a GC-ben, ami teljesen jól van optimalizálva.
2020. szept. 4. 22:16
Hasznos számodra ez a válasz?
 7/11 anonim ***** válasza:
100%
Pont ez a C# és a többi interpretált nyelv előnye... Hogy nem kell ilyen dolgokon agyalnod. :D Ezért szeretik, hiszen a fejlesztési idő 200% gyorsabb, mint C/C++-ba. C/C++ egy komolyabb programnál nagyon meg kell tervezni, nagyon oda kell figyelni. Egy rosszul elhelyezett mutató, hatalmas katasztrófát tud okozni. Ha olyan könnyen megy ez neked, mint az ágybavizelés akkor az azt jelenti, hogy nem értessz hozzá és a prosztatádat is nézesd meg kérlek.
2020. szept. 5. 01:10
Hasznos számodra ez a válasz?
 8/11 anonim ***** válasza:
49%
Ez csak egy flexelős kérdés. Menőzik hogy érti a pointerek, a dinamikus memóriakezelés. Én is átestem ezen anno, majd kinövöd...
2020. szept. 5. 08:28
Hasznos számodra ez a válasz?
 9/11 A kérdező kommentje:

8) nagyon nem. Ez inkább a hiányosságaim mutatja, hogy nem értem vagy értettem a garbage collector működését.


Egyébkémt köszönöm szépen mindenkinek a válaszát. Főleg a kettesnek és a négyesnek.

2020. szept. 6. 12:05
 10/11 anonim ***** válasza:
Nem is kell érteni a GC-t, mert rejtve van előtted és úgysem tudod mit csinál, mikor csinál, hogy csinálja. Annyit kell tudni, hogy van és majd jön és viszi a szemetet. :)
2020. szept. 6. 14:05
Hasznos számodra ez a válasz?
1 2

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!