Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > use of unassigned variable


Автор: nmn 13.1.2009, 18:52
Код

GCHandle h;
try
            {
                h = GCHandle.Alloc(pct, GCHandleType.Pinned);
               ...
            }
            finally 
            {
                h.Free();
            }

что ж причины ошибки вроде бы понятны, исключение может возникнуть до присвоения h
как можно сделать такую конструкцию, чтобы h.Free() вызвался обязательно, или это не надо, при возникновении исключения сборщик сам корректно удалит h?

Автор: hahol 13.1.2009, 18:58
чёт я мало понял зачем это .... 

у тя в конце метода сборщик сам бы убрал всё ... 

но вроде можно в 3 блока писать .

типа так 
try { какието действия }
catch { если исключения }
finally { при завершении }


Автор: Partizan 13.1.2009, 18:59
nmn, 
Код

GCHandle h = null;
try
            {
                h = GCHandle.Alloc(pct, GCHandleType.Pinned);
               ...
            }
            finally 
            {
                h.Free();
            }

Автор: nmn 13.1.2009, 19:25
Цитата(Partizan @ 13.1.2009,  17:59)
nmn, 
Код

GCHandle h = null;
try
            {
                h = GCHandle.Alloc(pct, GCHandleType.Pinned);
               ...
            }
            finally 
            {
                h.Free();
            }

все бы хорошо, но GCHandle это значимый тип, причем не реализует IDisposable
так что я вижу один вариант конструкции при которой Free обязательно вызовется
Код

GCHandle h = new GCHandle();
try
            {
                h = GCHandle.Alloc(pct, GCHandleType.Pinned);
               ...
            }
            finally 
            {
                try{h.Free();}
                cath(Exception){}
            }

может есть лучше варианты?

Автор: nmn 14.1.2009, 02:24
Цитата(hahol @ 13.1.2009,  17:58)
чёт я мало понял зачем это .... 

у тя в конце метода сборщик сам бы убрал всё ... 

но вроде можно в 3 блока писать .

типа так 
try { какието действия }
catch { если исключения }
finally { при завершении }

мусоросборщик не обратит внимания на структуру, т.к. они размещаются стеке и удаляются по выходу из метода, к тому же GCHandle не реализует IDisposable

Автор: PashaPash 14.1.2009, 11:28
Цитата(nmn @  13.1.2009,  19:25 Найти цитируемый пост)
так что я вижу один вариант конструкции при которой Free обязательно вызовется

//...
                try{h.Free();}
                cath(Exception){}
//...

Жестоко как-то smile  Лучше уж
Код

GCHandle h = GCHandle.Alloc(pct, GCHandleType.Pinned);
try
{
    // do something
}
finally
{
    if (h.IsAllocated)
    {
        h.Free();
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)