Расположение участников та реализация IDisposable

В моем Располагать методы (как тот ниже), каждый раз я хочу назвать someObj. Расположите (), у меня также есть проверка на someObj! =null.

Это из-за плохого дизайна с моей стороны? Их более чистый способ установить, что Избавляются от всех участников (реализующий IDisposable) используемый в объекте, назван, не имея риска исключения NullReference?

protected void Dispose(bool disposing)
        {
            if (disposing)
            {
               if (_splitTradePopupManager != null)
                {
                    _splitTradePopupManager.Dispose();
                }
             }
        }

Спасибо за проявленный интерес.

9
задан Manish Basantani 11 June 2010 в 12:25
поделиться

5 ответов

Может быть, кто-то еще сможет ответить на этот вопрос, но я лично не думаю, что это недостаток конструкции - просто это самый безопасный способ сделать это.

Тем не менее, ничто не мешает вам обернуть проверку 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, копирует ссылку в локальную переменную метода, устраняя эту возможность, хотя она и маловероятна.

5
ответ дан 4 December 2019 в 14:26
поделиться

Мне нравится решение @Dan Tao, но оно гораздо лучше как метод расширения, имо:

public static void SafeDispose(this IDisposable obj)
{
    if (obj != null)
        obj.Dispose();
}

Теперь вы можете просто вызвать member.SafeDispose() на любом IDisposable в вашей программе, не беспокоясь. :)

.
10
ответ дан 4 December 2019 в 14:26
поделиться

Единственный другой вариант, о котором я могу подумать, это создать вспомогательный метод DisposeParameter, который имеет объект в качестве параметра и проверяет, не является ли он null, а в противном случае утилизирует его. Таким образом, вам понадобится только одна строка кода, чтобы избавиться от объекта, но я не уверен, что это сделает его более читаемым.

0
ответ дан 4 December 2019 в 14:26
поделиться

Попробуйте это.

    protected void Dispose(bool disposing) 
    { 
        if (disposing) 
        {
           //for all members.. 
           if (null != member && member is IDisposible) 
            { 
                member.Dispose(); 
            } 
         } 
    } 
-1
ответ дан 4 December 2019 в 14:26
поделиться

Только вы знаете ответ на этот вопрос!

Не видя весь ваш класс, кому-либо еще трудно сказать, возможно ли, что эти члены когда-либо будут нулевыми при вызове Dispose .

(Конечно, как правило, ссылочный тип или тип значения, допускающий значение NULL, всегда может иметь значение NULL, поэтому, вероятно, рекомендуется всегда включать эти проверки на значение NULL.)

0
ответ дан 4 December 2019 в 14:26
поделиться
Другие вопросы по тегам:

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