Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
TypeName |
DisposeObjectsBeforeLosingScope |
CheckId |
CA2000 |
Kategorie (Category) |
Microsoft.Reliability |
Unterbrechende Änderung |
Nicht unterbrechend |
Ursache
Es wird ein lokales Objekt eines IDisposable-Typs erstellt. Das Objekt wird jedoch erst verworfen, nachdem sich alle Verweise auf das Objekt außerhalb des gültigen Bereichs befinden.
Regelbeschreibung
Wenn ein verwerfbares Objekt nicht explizit verworfen wird, bevor alle Verweise darauf außerhalb des gültigen Bereichs liegen, wird das Objekt zu einer unbestimmten Zeit verworfen, wenn der Garbage Collector den Finalizer des Objekts ausführt.Da möglicherweise ein Ausnahmeereignis auftritt, durch das die Ausführung des Finalizers des Objekts verhindert wird, muss das Objekt stattdessen explizit verworfen werden.
Behandeln von Verstößen
Um einen Verstoß gegen diese Regel zu beheben, rufen Sie Dispose für das Objekt auf, bevor sich alle Verweise darauf außerhalb des gültigen Bereichs befinden.
Beachten Sie, dass Sie die using-Anweisung (Using in Visual Basic) zum Umschließen von Objekten verwenden können, die IDisposable implementieren.Auf diese Weise umschlossene Objekte werden zum Abschluss des using-Blocks automatisch verworfen.
Im Folgenden werden einige Situationen beschrieben, in denen die using-Anweisung nicht zum Schutz von IDisposable-Objekten ausreicht und bewirken kann, dass CA2000 ausgelöst wird.
Um ein verwerfbares Objekt zurückzugeben, ist es erforderlich, dass das Objekt in einem try/finally-Block außerhalb eines using-Blocks erstellt ist.
Die Member eines verwerfbaren Objekts sollten nicht im Konstruktor einer using-Anweisung initialisiert werden.
Das Schachteln von Konstruktoren, die nur von einem Ausnahmehandler geschützt sind.Beispiel:
using (StreamReader sr = new StreamReader(new FileStream("C:\myfile.txt", FileMode.Create))) { ... }Dadurch wird bewirkt, dass CA2000 ausgelöst wird, da ein Fehler in der Konstruktion des StreamReader-Objekts dazu führen kann, dass das FileStream-Objekt nie geschlossen wird.
Dynamische Objekte sollten ein Schattenobjekt verwenden, um das Dispose-Muster von IDisposable-Objekten zu implementieren.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie keine Warnung dieser Regel, es sei denn, Sie haben eine Methode für das Objekt aufgerufen, die Dispose aufruft, zum Beispiel Close, oder die Methode, durch die die Warnung ausgelöst wurde, gibt ein IDisposable-Objekt zurück, das das Objekt umschließt.
Verwandte Regeln
CA2213: Verwerfbare Felder verwerfen
CA2202: Objekte nicht mehrmals verwerfen
Beispiel
Wenn Sie eine Methode implementieren, die ein verwerfbares Objekt zurückgibt, verwenden Sie einen try/finally-Block ohne einen catch-Block, um sicherzustellen, dass das Objekt verworfen wird.Mit einem try/finally-Block lassen Sie Ausnahmen zu, die am Fehlerpunkt ausgelöst werden sollen, und stellen sicher, dass das Objekt verworfen wird.
In der OpenPort1-Methode kann der Aufruf zum Öffnen des SerialPorts des ISerializable-Objekts oder der Aufruf von SomeMethod fehlschlagen.Eine CA2000-Warnung wird für diese Implementierung ausgelöst.
In der OpenPort2-Methode werden zwei SerialPort-Objekte deklariert und auf NULL festgelegt:
tempPort zum Testen, ob die Methodenoperationen erfolgreich ausgeführt werden.
port für den Rückgabewert der Methode.
tempPort wird erstellt und in einem try-Block geöffnet. Alle anderen erforderlichen Arbeiten werden im gleichen try-Block ausgeführt.Am Ende des try-Blocks wird dem port-Objekt, das zurückgegeben wird, der geöffnete Port zugewiesen und das tempPort-Objekt wird auf null festgelegt.
Der finally-Block überprüft den Wert von tempPort.Wenn nicht NULL, ist eine Operation in der Methode fehlgeschlagen und tempPort wird geschlossen, um sicherzustellen, dass alle Ressourcen freigegeben werden.Das zurückgegebene Port-Objekt enthält das geöffnete SerialPort-Objekt, wenn die Operationen der Methode erfolgreich waren, oder es ist NULL, wenn eine Operation fehlschlug.
Public Function OpenPort1(ByVal PortName As String) As SerialPort
Dim port As New SerialPort(PortName)
port.Open() 'CA2000 fires because this might throw
SomeMethod() 'Other method operations can fail
Return port
End Function
Public Function OpenPort2(ByVal PortName As String) As SerialPort
Dim tempPort As SerialPort = Nothing
Dim port As SerialPort = Nothing
Try
tempPort = New SerialPort(PortName)
tempPort.Open()
SomeMethod()
'Add any other methods above this line
port = tempPort
tempPort = Nothing
Finally
If Not tempPort Is Nothing Then
tempPort.Close()
End If
End Try
Return port
End Function
Public Function CreateReader1(ByVal x As Integer) As StreamReader
Dim local As New StreamReader("C:\Temp.txt")
x += 1
Return local
End Function
Public Function CreateReader2(ByVal x As Integer) As StreamReader
Dim local As StreamReader = Nothing
Dim localTemp As StreamReader = Nothing
Try
localTemp = New StreamReader("C:\Temp.txt")
x += 1
local = localTemp
localTemp = Nothing
Finally
If (Not (localTemp Is Nothing)) Then
localTemp.Dispose()
End If
End Try
Return local
End Function
public SerialPort OpenPort1(string portName)
{
SerialPort port = new SerialPort(portName);
port.Open(); //CA2000 fires because this might throw
SomeMethod(); //Other method operations can fail
return port;
}
public SerialPort OpenPort2(string portName)
{
SerialPort tempPort = null;
SerialPort port = null;
try
{
tempPort = new SerialPort(portName);
tempPort.Open();
SomeMethod();
//Add any other methods above this line
port = tempPort;
tempPort = null;
}
finally
{
if (tempPort != null)
{
tempPort.Close();
}
}
return port;
}
Standardmäßig überprüft der Visual Basic-Compiler auf Überläufe mit allen arithmetischen Operatoren.Daher kann jede arithmetische Visual Basic-Operation eine OverflowException auslösen.Dies kann zu unerwarteten Regelverletzungen führen, z. B. CA2000.Die folgende CreateReader1-Funktion erzeugt z. B. eine CA2000-Verletzung, da der Visual Basic-Compiler einen Befehl zur Überlaufprüfung für die Hinzufügung ausgibt, die eine Ausnahme auslösen könnte, durch die der StreamReader nicht verworfen werden würde.
Um dieses zu korrigieren, können Sie das Ausgeben von Überlaufprüfungen durch den Visual Basic-Compiler im Projekt deaktivieren, oder Sie können den Code entsprechend der folgenden CreateReader2-Funktion ändern.
Um das Ausgeben von Überlaufprüfungen zu deaktivieren, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen und klicken Sie anschließend auf Eigenschaften.Klicken Sie auf Kompilieren, klicken Sie auf Erweiterte Kompilierungsoptionen und aktivieren Sie dann Überprüfungen auf Ganzzahlüberlauf entfernen.