.Net - Правильно распоряжаться дочерним объектом. - PullRequest
1 голос
/ 19 августа 2010

Из анализа кода (Visual studio) я получил это предупреждение:

Предупреждение 2 CA2000: Microsoft.Reliability: ... Вызовите System.IDisposable.Dispose для объекта 'l' до того, как все ссылки на него выйдут из области видимости ...

Итак, я изменил код:

Dim l As LiteralControl = New LiteralControl
AddHandler l.DataBinding, AddressOf OnDataBinding
container.Controls.Add(l)

до

Dim l As LiteralControl = Nothing
Try
    l = New LiteralControl
    AddHandler l.DataBinding, AddressOf OnDataBinding
    container.Controls.Add(l)
Finally
    If Not l Is Nothing Then
        l.Dispose()
    End If
End Try

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

EDIT

Обратите внимание, что код взят с веб-страницы Microsoft: http://msdn.microsoft.com/en-us/library/system.web.ui.itemplate.instantiatein.aspx

1 Ответ

3 голосов
/ 19 августа 2010

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

вместо утилизации на наконец (который разрушает ваш объект все время ), вам нужно изменить это на улов и расположить в поймать, а затем сбросить исключение.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...