C# Constructor törlése minden Változóból?
2020-11-30T10:23:59+01:00
2020-12-03T11:55:24+01:00
2022-07-18T23:50:26+02:00
*deleted_51623945
Sziasztok!

Hogyan lehetne megoldani, hogy egy Constructor 'null' érték változtatásánál az összes példánynál is 'null' értéket mutasson?

példa:
Car car = new Car();
car = null;      <= ez eddig működik

példa 2:
Car car = new Car();
Car car2 = car;
Car car3 = car;
car = null;    <= ugye ennél meg a 'car2' és a 'car3' működni fog, de én azt akarnám, hogy az összes 'car' példány null-t mutasson

Ötlet?
Mutasd a teljes hozzászólást!

  • Szia!

    Röviden: valószínűleg sehogy.

    Az alapproblémát kellene megvizsgálni, ami miatt ez az igény felmerült.
    Mutasd a teljes hozzászólást!
  • Használj csak egy változót vagy mezőt, ne hármat.
    Mutasd a teljes hozzászólást!
  • Kezdd azzal, hogy megérted a pointer vagy a referencia fogalmát.

    Bár nem biztosíthatod, hogy egy null-értékadás esetén minden referencia értéke null legyen, de legvégső esetben megteheted, hogy rosszul használhatod az IDisposable interfészt és használhatatlanná teszed vele az objektumaidat. Ez azért rosszul használás, mert az IDisposable a managed és unmanaged resource-ok felszabadítására lett kitalálva, nem pedig arra, hogy használhatatlanná tegyél egy példányt, de végső soron működni fog.

    Ha a Dispose() metódust meghívják, állíts be egy Disposed field-et true-ra. Minden property és metódus esetében ellenőrizd, hogy ez a field true-e. Ha igen, dobj ObjectDisposedException-t.

    Egyetértek azokkal, akik azt mondják, hogy rossz az alapötlet.
    Mutasd a teljes hozzászólást!
  • Használj Collectiont és, ha "null-ozni" akarsz, akkor a Collection elemeit töröld (Clear).
    Collections (C#)
    Mutasd a teljes hozzászólást!
  • Üdv!

    Ez úgy jött nekem, hogy Unityben is ha egy GameObject-et megkeresek és változóba teszek, de végül törlöm az Objectet, akkor mindenhol 'null' értéket ad vissza.

    Ez azért kell, mert listben gyűjtöm az Objecteket, és van mikor egy egy scriptben használom a GameObjectet, de mikor törlöm a listből, akkor a scriptekben is törlődnie kellene vagyis az összes változónak null értéket kellene adnia.
    Mutasd a teljes hozzászólást!
  • Szia!

    A listádban nem objektumokat tárolsz, hanem referenciákat objektumokra. Amikor törölsz a listából, a referenciát törlöd, nem magát az objektumot - azt majd a garbage collector törli, amikor úgy érzi. De amíg bárhol máshol (pl. a scriptekben) van élő referencia ugyanarra az objektumra, addig az objektum létezni fog, és a scriptek is elérik.

    Többféle megoldás lehetséges a problémádra, pl.:
    - az objektumon belül jelzed, hogy már érvénytelen. A scriptek ezt használat előtt mindig vizsgálják, ha érvénytelen az objektum, nem használják tovább.
    - értesíted a programod többi komponensét/scripteket, ha egy objektum már nem él, és törölniük kell a referenciákat.
    - a scriptek csak rövid ideig tárolnak közvetlen referenciákat pl., hívásonként újra elkérik az objektumokat. Így mindig a friss, élő objektumokkal dolgoznak.
    Mutasd a teljes hozzászólást!
  • Ez különösen multithreading esetén vezetne érdekes dolgokhoz: derék program alatt hirtelen null-ra változna egy referencia, amivel ő épp dolgozna valamit.
    Mutasd a teljes hozzászólást!
  • Car az mi? Osztaly vagy struktura? Ha osztaly, akkor eleve ugy fog mukodni, ahogy leirtad, mert az referencia tipus. Ha struct, akkor meg ertek tipus, es nem lesz null.

    Ajanlom ezt a konyvet:
    https://reiteristvan.files.wordpress.com/2018/01/reiter-istvc3a1n-c-..
    25. oldal
    Mutasd a teljes hozzászólást!
  • Valami hasonló érhető el a weak reference használattal.

    Weak References
    Mutasd a teljes hozzászólást!
  • Weak reference esetén a garbage collectortól függ, meddig él még az objektum. Tehát a listából törlés után még élni fog valameddig - és ha amúgy van elég memória, akkor sokáig.
    Mutasd a teljes hozzászólást!
  • A memória menedzselése nem szükséges a GC miatt, majd kidobja az objektumot, amikor kell a hely.
    Ez belső ügy, talán kevéssé kellene foglalkoznunk vele.
    Amivel kell, hogy a kérdező példája szerinti:

    Car car = new Car(); Car car2 = car; Car car3 = car; car = null;
    esetben a car2 és car3 is értelmesen reagáljon, ha a car elérésnél szükségtelenné vált.

    Persze másként kellene kezelni, vagyis

    // Car car = new Car() HELYETT: WeakReference car = new WeakReference(new Car()); // car = null HELYETT: car.Target = null;
    Persze ki kellene próbálni, mert ez csak elméleti okoskodás. :)
    Mutasd a teljes hozzászólást!
  • Erre nem kell WeakReference, bármilyen közvetítő objektum tudja ezt. A WeakReference itt azt eredményezné, hogy egy külső hatásra egyszercsak null lesz a referencia. Semmi garancia semmire. A WeakReferencia felhasználási területe teljesen más.

    Közvetítő objektumot be lehet hozni, és a Car példányt csak azon keresztül elérni. De ha ez a közvetítő objektum bárhogy kiadja a referenciát, akkor megintcsak bármi más is tarthat referenciát a Car példányra, és ugyanott lehet a kérdező. A megoldandó probléma megfogalmazásával van a baj, aminek oka a referencia, objektum, változó fogalmak körüli zavar. Azt kéne tisztává tenni, és akkor meglenne a megoldás is.
    Mutasd a teljes hozzászólást!
  • Valóban, arra nem figyeltem, hogy akaratlanul is elvész az objektum.

    De a módszer működhet, egy weakreference-hez hasonló tároló osztállyal, akár azonos szintaxissal (de mivel nem weakreference a belső megvalósítás, így nem is dobja el attól, hogy szükséges a GC-nek a memória).

    Persze meg kellene érteni, mire is kell, hogy milyen megoldás kell.
    Mutasd a teljes hozzászólást!
Címkék
abcd