2010-06-22 3 views
0

Мы получаем следующее предупреждение от анализа кода в Visual Studio 2010, и мне интересно, является ли это ложным положительным результатом, о котором мы можем смело игнорировать или код должен быть реорганизован, чтобы правильно распоряжаться объект.CA2202 Предупреждение от анализа кода для утилизации OracleConnection

Соответствующий код:

public void MyFunction() 
{ 
    OracleConnection oraConnection = null; 
    OracleCommand oraCommand = null; 

    try 
    { 
     // Connect to the database 
     oraConnection = new OracleConnection(connectionString); 
     oraConnection.Open(); 
     // Prepare and run the query 
     oraCommand = new OracleCommand(sqlQuery, oraConnection); 
     oraCommand.ExecuteNonQuery(); 
    } 
    catch { throw; } 
    finally 
    { 
     // Perform a safe cleanup 
     if (oraCommand != null) { oraCommand.Dispose(); } 
     if (oraConnection != null) 
     { 
      oraConnection.Close(); 
      oraConnection.Dispose(); 
     } 
    } 
} 

Соответствующее сообщение об ошибке:

Предупреждение 18 CA2202: Microsoft.Usage: Объект 'oraConnection' могут быть расположены более , чем один раз в методе «ClassName. MyFunction()». Чтобы избежать генерации System.ObjectDisposedException, вы не должны вызывать Dispose более одного времени на объект.

ответ

1

Если вы удалите строку:

oraConnection.Close(); 

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

Возможно, вы также захотите заменить свою попытку/окончательно с помощью инструкции.

Обратите внимание, что в собственных руководствах Microsoft указано, что IDisposable.Dispose должен быть реализован таким образом, что его можно безопасно вызывать несколько раз. Это означает, что предупреждение CA2202 можно безопасно игнорировать, как указано в the comment by JoeM27 on the MSDN page for CA2202.

+0

Я окунулся в документацию Oracle для ODP.NET, и они указывают, что OracleConnection.Dispose() вызывает метод Close, поэтому похоже, что рекомендации будут обновлены, чтобы просто вызвать метод Dispose. – rjzii