2011-06-18 4 views
3

Привет Я смотрю на некоторых старых C# кода и, заметив много кода, как это:поток программы после исключения в C#

void SomeFunction() 
{ 
    if (key.Length != Dimensions) 
    { 
     throw new KeySizeException(); 
    } 
    else 
    { 
     SomeOtherFunction(); 
    } 
} 

Я хочу знать, если может когда-нибудь случай, когда блок else необходим? Могу ли я безопасно сократить код до этого без каких-либо последствий?

void SomeFunction() 
{ 
    if (key.Length != Dimensions) 
    { 
     throw new KeySizeException(); 
    } 

    SomeOtherFunction(); 
} 

По умолчанию исключение должно выбросить программный поток из этого метода правильно? Но мне просто интересно, есть ли способ в DotNet настроить, как необработанные исключения обрабатываются, что приведет к тому, что вторая реализация будет работать иначе, чем первая?

+0

Thechnically они такие же. Вы можете принять решение на основе удобочитаемости. Некоторые люди находят, что другое помогает читать. –

+0

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

ответ

5

Вам не нужен блок «else». Это избыточно. Если вы используете инструмент рефакторинга, например «Reshaper» или «JustCode», такие избыточные элементы кода обычно указываются.

+0

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

1

Эти два полностью эквивалентны.

3

- это явный терминал в этом кодовом блоке, вызов метода будет эффективно завершен в этой точке. Это означает, что блок else является избыточным и может быть удален.

0

Как уже отмечалось, две части кода эквивалентны.

Я думал, что некоторые дополнительные мысли.

Во-первых, код, как показано, по существу реализует метод-обертку (SomeFunction), который работает как предложение guard для SomeOtherFunction. Я был бы осторожен в этом - когда ваше KeySizeException поймано, вы не узнаете только из трассировки стека, в которой SomeOtherFunction участвовал вообще. Это также означает, что у вас нет видимости этого требования SomeOtherFunction посредством простой проверки кода этого метода.

Кроме того, вы могли бы рассмотреть вопрос о повторном использовании этих типов кода в .Net 4.0 Code Contracts - они могли бы значительно облегчить чтение кода.

Заключительная мысль - в таких случаях, как ваша Я иногда испытываю искушение покинуть другое. Это делает 100% понятным для кого-то другого, что предполагается поведение if/else.

+0

Конечно, я предполагаю, что ваш реальный код выглядит совсем не так, как ваш пример - пожалуйста, проигнорируйте, если это так :) –

+0

Привет, Дэвид благодарен за совет. Вы правы в своем комментарии, хотя я просто махнул этим примером, реальный код отличается. – CodeAndCats

1

В C# оба работают таким же образом. Я думаю, вы думаете, что если вы обрабатываете исключение (а не бросаете его), как избавиться от выполнения второго оператора?

void SomeFunction() 
{  
    if (key.Length != Dimensions)  
    { 
     throw new KeySizeException(); //Halt the execution of SomeFunction method 
    } 
     SomeOtherFunction(); 
} 

Если вы работаете и не хотите выполнять SomeOtherFunction, вы можете просто вернуться, как показано ниже.

+0

спасибо, но не я не был :) – CodeAndCats

 Смежные вопросы

  • Нет связанных вопросов^_^