В моем Располагать методы (как тот ниже), каждый раз я хочу назвать someObj. Расположите (), у меня также есть проверка на someObj! =null.
Это из-за плохого дизайна с моей стороны? Их более чистый способ установить, что Избавляются от всех участников (реализующий IDisposable) используемый в объекте, назван, не имея риска исключения NullReference?
protected void Dispose(bool disposing)
{
if (disposing)
{
if (_splitTradePopupManager != null)
{
_splitTradePopupManager.Dispose();
}
}
}
Спасибо за проявленный интерес.
Может быть, кто-то еще сможет ответить на этот вопрос, но я лично не думаю, что это недостаток конструкции - просто это самый безопасный способ сделать это.
Тем не менее, ничто не мешает вам обернуть проверку null
и вызов Dispose
в удобный метод:
private void DisposeMember(IDisposable member)
{
if (member != null)
member.Dispose();
}
Тогда ваш метод Dispose
будет выглядеть немного чище:
protected void Dispose(bool disposing)
{
if (disposing)
{
DisposeMember(_splitTradePopupManager);
DisposeMember(_disposableMember2);
DisposeMember(_disposableMember3);
}
}
В качестве дополнительного бонуса, это также устраняет потенциальное состояние гонки в вашем исходном коде. При выполнении в многопоточном контексте шаблон if (_field != null) _field.Dispose()
может привести к NullReferenceException
, если _field
будет установлен в null
между проверкой и утилизацией (редко, но возможно). Передача _field
в качестве аргумента в метод, такой как DisposeMember
, копирует ссылку в локальную переменную метода, устраняя эту возможность, хотя она и маловероятна.
Мне нравится решение @Dan Tao, но оно гораздо лучше как метод расширения, имо:
public static void SafeDispose(this IDisposable obj)
{
if (obj != null)
obj.Dispose();
}
Теперь вы можете просто вызвать member.SafeDispose()
на любом IDisposable
в вашей программе, не беспокоясь. :)
Единственный другой вариант, о котором я могу подумать, это создать вспомогательный метод DisposeParameter
, который имеет объект в качестве параметра и проверяет, не является ли он null, а в противном случае утилизирует его. Таким образом, вам понадобится только одна строка кода, чтобы избавиться от объекта, но я не уверен, что это сделает его более читаемым.
Попробуйте это.
protected void Dispose(bool disposing)
{
if (disposing)
{
//for all members..
if (null != member && member is IDisposible)
{
member.Dispose();
}
}
}
Только вы знаете ответ на этот вопрос!
Не видя весь ваш класс, кому-либо еще трудно сказать, возможно ли, что эти члены когда-либо будут нулевыми при вызове Dispose
.
(Конечно, как правило, ссылочный тип или тип значения, допускающий значение NULL, всегда может иметь значение NULL, поэтому, вероятно, рекомендуется всегда включать эти проверки на значение NULL.)