Ответ Вартека с 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);
Первое лучше. Он обеспечивает удаление даже в случае возникновения исключения и правильно обрабатывает случай, когда Create (0)
возвращает значение null (т.е. не пытается вызвать Dispose ()
на нулевой экземпляр).
Использование оператора
всегда лучше, потому что ...
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))
Однако,
Единственное место, где вы не хотите использовать блок using, - это место, где одноразовый объект находится за пределами функции. В этом случае ваш класс должен реализовать IDisposable и избавиться от объекта в его Dispose ().
Там, где можно, используйте , используя
, по причинам, которые цитирует Марк. OTOH это не мертвое решение, поскольку иногда время жизни объекта не может быть определено как лексическая область видимости, поэтому используйте его разумно.
Оператор using дает хороший синтаксис плюс защиту от исключений. Вы не можете оставить оператор using без вызова Dispose (он преобразуется в блок finally с вызовом для удаления). Во втором сценарии, если бы у вас было исключение между Create и Dispose, вы не вызывали бы dispose напрямую. Это не проблема, если вы не используете неуправляемые ресурсы, но в противном случае произойдет утечка.