Который лучше, и когда: использование оператора или вызов Располагают () на IDisposable в C#?

Ответ Вартека с cURL не сработал для меня. Это произошло с небольшим улучшением из-за моей конкретной проблемы.

Например,

Когда на сервере происходит перенаправление (например, когда вы пытаетесь сохранить изображение профиля в Facebook), вам понадобится следующий набор параметров:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Полное решение становится:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

6
задан mkelley33 23 June 2009 в 19:28
поделиться

5 ответов

Первое лучше. Он обеспечивает удаление даже в случае возникновения исключения и правильно обрабатывает случай, когда Create (0) возвращает значение null (т.е. не пытается вызвать Dispose () на нулевой экземпляр).

26
ответ дан 8 December 2019 в 02:18
поделиться

Использование оператора всегда лучше, потому что ...

  • вы не можете забыть вызвать Dispose () , даже если код превращается в разные пути кода
  • Dispose () вызывается, даже если есть исключение. Он также проверяет null перед вызовом Dispose () , что может быть полезно (при условии, что вы не просто вызываете new ).

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

using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
    input.copyTo(output);
}

Форматировщик кода VS оставит два оператора, начинающиеся в одном столбце.


Фактически, в некоторых ситуациях вам даже не нужно повторять оператор using ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))

Однако,

7
ответ дан 8 December 2019 в 02:18
поделиться

Единственное место, где вы не хотите использовать блок using, - это место, где одноразовый объект находится за пределами функции. В этом случае ваш класс должен реализовать IDisposable и избавиться от объекта в его Dispose ().

3
ответ дан 8 December 2019 в 02:18
поделиться

Там, где можно, используйте , используя , по причинам, которые цитирует Марк. OTOH это не мертвое решение, поскольку иногда время жизни объекта не может быть определено как лексическая область видимости, поэтому используйте его разумно.

3
ответ дан 8 December 2019 в 02:18
поделиться

Оператор using дает хороший синтаксис плюс защиту от исключений. Вы не можете оставить оператор using без вызова Dispose (он преобразуется в блок finally с вызовом для удаления). Во втором сценарии, если бы у вас было исключение между Create и Dispose, вы не вызывали бы dispose напрямую. Это не проблема, если вы не используете неуправляемые ресурсы, но в противном случае произойдет утечка.

2
ответ дан 8 December 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: