Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > using VS finally


Автор: DenWPF 17.4.2011, 00:16
Эти два кода одинаковые?
Как правильней писать?

finally:

Код


DialogResult result;
var testForm = new TestForm();
try
{
    result = testForm.ShowDialog();
}
finally
{
    testForm.Close();
}
switch (result)
{
    case DialogResult.OK:
        break;
    case DialogResult.Cancel:
        break;
    default:
        throw new ArgumentOutOfRangeException();
}


using:

Код

DialogResult result;
using (var testForm = new TestForm())
{
    result = testForm.ShowDialog();
}
switch (result)
{
    case DialogResult.OK:
        break;
    case DialogResult.Cancel:
        break;
    default:
        throw new ArgumentOutOfRangeException();
}


Автор: Экскалупатор 17.4.2011, 00:37
нет не одинаковый. finally гарантирует что код внутри этого блока будет выполнен даже если будет ошибка. при этом объект класса не уничтожается, т.е. после этого блока форму можно показать еще раз. а вот в блок using уничтожает все что было в нем создано и все это становиться недоступным вне его. т.е. форму второй раз уже не вызовешь, придется создавать новую.
первый пример в данном случае не имеет смысла, блок finally используется(обычно) для освобождения ресурсов(закрыть соединение с базой, закрыть поток и пр.).

а второй тоже ничего особого не добавляет. GC все равно все уберет когда будет нужно. обычно этот блок используют когда нужно что бы ресурс освобождался сразу после окончания блока. но форма, как мне кажется, таким ресурсом не является.

Добавлено через 2 минуты и 6 секунд
*к тому же на сколько я понимаю к моменту выполнения блока finally форма уже будет закрыта, так что смысла в нем совсем не вижу, только если в этой форме отключена кнопка закрытия и форма будет закрываться как то подругому...

Автор: DenWPF 17.4.2011, 00:42
ShowDialog - может вызвать исключения, значит надо сделать так

Код

DialogResult result;
var testForm = new TestForm()
try
{
    result = testForm.ShowDialog();
}
catch{//..тут какая то обработка}
switch (result)
{
    case DialogResult.OK:
        break;
    case DialogResult.Cancel:
        break;
    default:
        throw new ArgumentOutOfRangeException();
}


Автор: wester 17.4.2011, 01:00
DenWPF, 
Стремись к тому, что бы код не создавал исключительных ситуаций
пример из msdn http://msdn.microsoft.com/ru-ru/library/c7ykbedk.aspx

Автор: Экскалупатор 17.4.2011, 01:31
Цитата(DenWPF @  16.4.2011,  23:42 Найти цитируемый пост)
ShowDialog - может вызвать исключения, значит надо сделать так

сам метод может вызвать исключение или код внутри формы? если второе то не лучше ли использовать блок try-catch внутри формы?а уже внутри можно сделать блок finally который будет закрывать форму и возвращать какое то значение, типа DialogResult.No. вообще оборачивать в подобные блоки весь код какого класса(имеется ввиду в один блок весь код), на мой взгляд, не совсем удачная идея. могут возникнуть вопросы при отладке, потому что этот блок будет ловить все исключения и ты можешь пропустить что то важно. лучше оборачивать те места которые могут вызвать исключение. пусть класс сам обрабатывает свои исключительные ситуации.
а в твоем примере достаточно простого:
Код

if (testForm.ShowDialog() == DialogResult.OK)
{
}
else
{
}

Автор: DenWPF 17.4.2011, 10:01
В описании у ShowDialog() есть два исключения, меня интересуют они. Да,  я знаю что лучше код в форме обрабатывать там.

Автор: Экскалупатор 17.4.2011, 11:21
ну в таком случае конечно, но тогда желательно ловить конкретные исключения, а не все. т.е. нужно указать в блоке Catch какой тип исключения ему обрабатывать. в итоге у тебя должно получиться три Catch(один без параметров, что бы таки ловил все что не отловят другие...), но необходимости в Finally я все равно не вижу, потому как ресурсы освобождать не требуется.

p.s. исходя из описаний исключений этого метода, мало вероятно что ты запустишь только что созданный экземпляр окна дважды или что ты ее отключил. но дело твое.

Автор: DenWPF 17.4.2011, 11:49
я там с аргументами не понял, какая ошибка в каких аргументах может быть?

Автор: Экскалупатор 17.4.2011, 12:02
Цитата(DenWPF @  17.4.2011,  10:49 Найти цитируемый пост)
я там с аргументами не понял, какая ошибка в каких аргументах может быть? 

ты о чем? поподробнее?
я имел ввиду вот это:
Код

try
            { 
                f.ShowDialog();
            }
            catch (InvalidOperationException ex)
            {
                //отлавливает только InvalidOperationException
            }
            catch
            {
                //отлавливает все остальные
            }

Автор: DenWPF 17.4.2011, 17:20
да, там ещё ошибка аргумента есть..

Автор: Экскалупатор 17.4.2011, 17:27
ммм, форму делаешь ты? как в ней может быть три значения? но в любом случае просто можно добавить еще один Catch

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