Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> using VS finally 
V
    Опции темы
DenWPF
Дата 17.4.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Эти два кода одинаковые?
Как правильней писать?

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();
}


PM MAIL   Вверх
Экскалупатор
Дата 17.4.2011, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

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

Добавлено через 2 минуты и 6 секунд
*к тому же на сколько я понимаю к моменту выполнения блока finally форма уже будет закрыта, так что смысла в нем совсем не вижу, только если в этой форме отключена кнопка закрытия и форма будет закрываться как то подругому...
PM MAIL ICQ   Вверх
DenWPF
Дата 17.4.2011, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



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();
}


PM MAIL   Вверх
wester
Дата 17.4.2011, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 27.2.2009

Репутация: 3
Всего: 13



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

Это сообщение отредактировал(а) wester - 17.4.2011, 01:01
PM MAIL   Вверх
Экскалупатор
Дата 17.4.2011, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

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

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

PM MAIL ICQ   Вверх
DenWPF
Дата 17.4.2011, 10:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



В описании у ShowDialog() есть два исключения, меня интересуют они. Да,  я знаю что лучше код в форме обрабатывать там.
PM MAIL   Вверх
Экскалупатор
Дата 17.4.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

p.s. исходя из описаний исключений этого метода, мало вероятно что ты запустишь только что созданный экземпляр окна дважды или что ты ее отключил. но дело твое.
PM MAIL ICQ   Вверх
DenWPF
Дата 17.4.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



я там с аргументами не понял, какая ошибка в каких аргументах может быть?
PM MAIL   Вверх
Экскалупатор
Дата 17.4.2011, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



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

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

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

PM MAIL ICQ   Вверх
DenWPF
Дата 17.4.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



да, там ещё ошибка аргумента есть..
PM MAIL   Вверх
Экскалупатор
Дата 17.4.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



ммм, форму делаешь ты? как в ней может быть три значения? но в любом случае просто можно добавить еще один Catch
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1384 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.