Inicializace proměnné uvnitř metody

hlasů
-1

Mám-li inicializovat proměnné takto:

Předpokládejme, že máme:

T obj = GetT();

v aspx stránky. ( GetT()Může vrátit hodnotu null).
A já chci zvládnout OBJ uvnitř funkce

public void HandlingT(T obj){
    if(condition && obj == null){
        obj = new T();
    }
    //...handling object T
}

Tak dostaneme:

T obj = GetT();
HandlingT(obj);

Problém je v tom, když jsem volání funkce HandlingT()v aspx stránky, objje stále nulový, i když conditionje pravda,

Položena 14/09/2017 v 12:19
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Pak změnit svůj způsob vrátit Tjako níže pomocí Obecný. V podstatě, vytváříte objekt, ale to se vrátí a tak se stane null, když jde mimo rozsah funkce

public T HandlingT<T>(T obj){

Pokud Tje jen zástupným symbolem pro skutečný objekt, pak byste měli mít stejně jako

public T HandlingT(T obj){
    if(condition && obj == null){
        obj = new T();
    }
    //...handling object T

   return obj;
}
Odpovězeno 14/09/2017 v 12:21
zdroj uživatelem

hlasů
0

Jste matoucí odkazy s hodnotami. Když toto:

T obj = GetT();
HandlingT(obj);

A pak uvnitř HandlingTmetody to následujícím způsobem:

obj = new T();

Že nemá nic společného s objproměnnou vytvořenou vně této metody. Proměnné shodou okolností mají stejný název, ale nejsou stejné variabilní. To, co děláte, je vytvoření instance Ta přiřazením k lokální proměnné v metodě. Chcete-li přiřadit tento odkaz na proměnnou mimo metody, které přiřazení musí být provedena na této proměnné.

Tak například můžete vrátit instance z metody:

public T HandlingT(T obj){
    if(condition && obj == null){
        obj = new T();
    }
    return obj;
}

A používání, že se vrátil hodnotu mimo metody:

T obj = GetT();
obj = HandlingT(obj);

Zjednodušeně řečeno, An úkol stane proměnné, nikoli k objektu v paměti. Máte-li odkazovat na objekt s proměnnou můžete změnit tento objekt v paměti. Ale pokud přiřadíte proměnnou do nového objektu, nejste mění, co je proměnná původně ukázal, že jste jej právě ukazuje na něco jiného.

Zvaž toto:

void DoSomething(MyObj obj)
{
    obj = new MyObj();
    obj.Something = "foo";
}

Tento příklad nedělá nic pro instanci, který byl původně předán metodě. Nová instance je vytvořena a je označen pouze v rámci metody. Jakmile metody východy, že instance je čištění paměti odstraněna a původní instance, který byl předán metoda je nezměněn.

Naproti tomu:

void DoSomething(MyObj obj)
{
    obj.Something = "foo";
}

Vzhledem k tomu, je vytvořena žádná nová instance, lokální objproměnná stále odkazuje na stejné instance v paměti, který byl předán metodě. Tento odkaz se sleduje a původní instance je modifikován tak, že modifikace budou viditelné mimo způsobu po metoda dokončí.

Odpovězeno 14/09/2017 v 12:28
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more