Когда переменная IDisposable, у нас есть ключевое слово using
для управления удалением. Но что, если мы вернем значение в методе, должны ли мы иметь using
дважды?
StringContent stringToStringContent(string str)
{
using (StringContent content = new StringContent(str))
{
return content;
}
}
void logStringContent()
{
using (StringContent content = stringToStringContent("test"))
{
Debug.WriteLine(content.ToString());
return;
}
}
В этом примере выше у меня есть только 1 new
, но у меня есть 2 using
для одного и того же. Поэтому я чувствую, что это неуравновешенно. Лучше ли:
а) сохранить как using
, так и язык/компилятор знает свою работу, чтобы избежать двойного удаления?
б) держать вместе только using
с new
, а в остальных случаях не надо?:
void logStringContent()
{
StringContent content = stringToStringContent("test");
Debug.WriteLine(content.ToString());
return;
}
в) оставить только using
, когда не вернетесь, и не надо, когда вернетесь?:
StringContent stringToStringContent(string str)
{
return new StringContent(str);
}
Единственное, что я чувствую, это то, что b) не является правильным ответом, потому что он не будет работать для таких проблем, как описанный здесь: .NET HttpClient зависает после нескольких запросов (если не активен Fiddler)
.Dispose
, которую я видел, использует шаблон вызова перегрузкиDispose(bool disposing)
, гдеdisposing
истинно только в первый раз. Таким образом, в большинстве реализаций вызов.Dispose
несколько раз безвреден. - person Kirk Woll   schedule 31.05.2013return new StringContent(str);
? Если уж на то пошло, вы могли бы простоusing StringContent content = new StringContent(str)
и ничего не потерять. С - правильный ответ. - person Robert Harvey   schedule 31.05.2013IDisposable.Dispose
(disposing
) от удаления финализатором (!disposing
). Это не имеет никакого отношения к тому, был ли уже вызванDispose
-disposing
должно быть истинным для каждого вызоваDispose
в правильной реализации. - person anton.burger   schedule 03.06.2013