WebHU - Programozási kérdések és válaszok

Lusta inicializálás az eseménykezelőben

Azon tűnődöm, hogyan lehet "lustán" példányosítani az objektumot egy eseménykezelőből

Ha van egy WinForms alkalmazásom és például két gombom:

public partial class Form1 : Form
{
    //MyClass obj = new MyClass();

    MyClass obj;

    public Form1()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        obj = new MyClass();
        obj.StartWork();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        obj.StopWork();
    }
}

Mivel nem kell hozzáférnünk a MyClass tagjaihoz, mielőtt a felhasználó a button1-re kattintana, ésszerű lenne csak az osztályt példányosítani az eseménykezelőben. A második gombra kattintva azonban null referencia kivételt dob, mivel az obj változó ebben a hatókörben nem hivatkozik semmire.


  • a button2-t nem kell letiltani amíg az 1-es gombot meg nem nyomják, ezt nem lehet egyetlen gombbal megtenni? 06.01.2014
  • becsomagolhatod az obj-t egy tulajdonságba, példányosíthatod a get metódusban. 06.01.2014

Válaszok:


1

Használhatja a következőt: Lazy<T>.

public partial class Form1 : Form
{
    Lazy<MyClass> obj = new Lazy<MyClass>();

    public Form1()
    {
        InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {
        obj.Value.StartWork();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        obj.Value.StopWork();
    }
}

A Value tulajdonság elérése kényszeríti az objektum létrehozását.

Egyéni inicializálási függvényt is megadhat a Lazy konstruktornak.

06.01.2014
  • Köszönöm. Működik. Tehát a Lazy‹T› osztálynál a létrehozás csak akkor történik meg, ha az érték tulajdonságot használjuk a kódban, korábban nem? 06.01.2014
  • Az biztos, hogy nem úgy épül fel, ahogy van. A MyClass az építés során inicializálva lesz. Az eseménykezelő testeinek nem sikerül a fordítása. 06.01.2014
  • @user: Igaz. (De elfelejtettem módosítani a típust Lazy<MyClass>-re a mintámban – már javítva). 06.01.2014
  • @Gusdor: Javítottam a típust Lazy<MyClass>-re. Különben nem értem, miért nem működik. 06.01.2014

  • 2

    Ezzel meg kell szüntetni a kivételt:

    private void button2_Click(object sender, EventArgs e)
    {
        // You need to make sure that obj is not null when this button is clicked.
        // One way is to disable this button until button1 is pressed. 
        // Or you can add this if statement.
        if(obj != null)
        {
            obj.StopWork();
        }
    }
    

    De a kijelentésed

    mert az obj változó ebben a hatókörben nem hivatkozik semmire

    rossz. A obj a Form1 osztályod összes metódusával elérhető. Tehát amikor először a button1 elemre kattint, akkor példányosítja az osztályváltozót obj, amelyet bárhol használhat az osztályban. De hozzá kell adni a if(obj != null)-t arra az esetre, ha a felhasználó először a button2-re kattint.

    06.01.2014
  • Ez nem globális – ez egy terület. 06.01.2014
  • A Form1 osztályon belül globális. De valószínűleg úgy kapta meg a NullReferenceExceptiont, hogy a button2-re kattintott anélkül, hogy először az 1-es gombra kattintott volna. 06.01.2014
  • member, nincsenek globálisok a c#-ban 06.01.2014
  • @Chris: Nincs olyan, hogy „belül globális”. A globális globális, és a C#-ban nincsenek globálisok. 06.01.2014
  • obj osztályváltozó. 06.01.2014
  • A hatókörről beszélek. Nem azt mondom, hogy az obj globális kulcsszó, hanem azt, hogy a Form1 osztály összes metódusa globális hozzáféréssel rendelkezik. De elnézést a rossz szó használatáért. Tudom, hogy mi a változó és mi a tulajdonság/mező/osztály változó. 06.01.2014
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..