Обработка исключающих ситуации

224
29 сентября 2017, 15:36

Хотел задать вопрос. Я прочитал что такое try-catch и using, Но не понял в чем разница. Пожалуйста объясните. Если можно с примерами для mvc. Заранее спасибо.

Answer 1

try/catch/finally - это непосредственно средство языка для обработки исключений (с этим, думаю, всё в целом понятно). using - это синтаксический сахар, используемый в отдельных случаях.
Конструкция using используется для объектов, реализующих интерфейс IDisposable и предназначен для детерминированной очистки ресурсов (то есть здесь и сейчас).

В чем заключается синтаксический сахар? Поясню на примере. Этот код

using(var disposable = new SomeDisposableClass())
{
    // какой-то код
}

будет развернут компилятором в нечто наподобие

var disposable = new SomeDisposableClass();
try
{
    // какой-то код
}
finally 
{
    if(disposable != null)
        disposable.Dispose();
}

Как можно видеть, using - это частный случай использования конструкции try/catch/finally/, причем не для всех классов, а только для реализующих интерфейс IDispoasable. Как можно заметить, в коде, получающемся из using, не используется блок catch, то есть любые исключения, выброшенные внутри using, будут проброшены наверх.

Почему именно интерфейс IDisposable? Это отдельная тема. Вкратце: в C# пользователь не контролирует выделение и очистку памяти напрямую (так как это существенная головная боль), и всю эту рутину на себя берёт сборщик мусора. Сборщик сам удаляет объекты из памяти, и пользователь знать ничего не знает о том, когда и как он это сделает. Но иногда пользователю. нужно освободить те или иные ресурсы здесь и сейчас. Для этого предназначен интерфейс IDisposable, у которого есть метод Dispose. Если какой-то класс владеет теми или иными управляемыми или неуправляемыми ресурсами, то он должен реализовать этот интерфейс, и освободить их в методе Disopose (реализация метода разумеется возлагается на самого программиста). Конструкция using позволяет создать такой объект, сделать с ним что-то внутри конструкции, а затем вызвать у него Dispose, тем самым освободив его ресурсы тогда, когда это нужно.

READ ALSO
Десериализация string в List<string>

Десериализация string в List<string>

Вопрос заключается в следующем 1) Есть класс PivotBlock, который содержит среди всех полей поле ColumnField

155
Не выполняется второй запрос C# + xNet

Не выполняется второй запрос C# + xNet

Использую библиотеку xNet

289
C# - непонятно, как работает подсчет количества элементов коллекции с помощью Linq

C# - непонятно, как работает подсчет количества элементов коллекции с помощью Linq

Здесь с помощью лямда выражений происходит поиск количества элементов в спискеНо я не понимаю как это работает

326