2014-01-16 5 views
10

Hier geht es um die ReSharper-Warnung "Zugang zu entsorgtem Verschluss", die üblicherweise dann auftritt, wenn ein später entsorgtes Objekt in einem Lambda verwendet wird. Access to disposed closure in C#? diskutiert dies in ein bisschen mehr Detail.Zugang zu entsorgtem Verschluss - Methoden als sicher markieren

Meine Frage ist: Für Methoden, die solche lamdbas nehmen und führen sie sofort (so dass Sie sicher sein können, sie immer dann ausgeführt werden, bevor der das Objekt angeordnet ist):

Gibt es eine Möglichkeit, sie als sicher zu markieren, dass jeder Code, der diese Methode verwendet, diese Warnungen nicht mehr erzeugt?

Beispiel:

using (var myObject = new MyDisposableObject()) 
{ 
    DoThisTwice(() => myObject.DoSomething()); 
} 

... 

void DoThisTwice(Action do) 
{ 
    do(); 
    do(); 
} 

DoThisTwice einen Delegierten dauert (oder eine Lambda) und führt sie synchron. Zu dem Zeitpunkt, zu dem die Methode zurückkehrt, wird das Lambda nicht mehr ausgeführt. Erst dann ist die myObject entsorgt, also sind wir gut zu gehen. Wir könnten die Zeile, die DoThisTwice aufruft, mit einem Kommentar markieren, aber das muss an allen Stellen mit der Methode in ähnlicher Weise geschehen. Stattdessen möchte ich DoThisTwice als sicher markieren, damit Resharper keine Warnungen für Anrufer der Methode anzeigt.

Antwort

18

Sie können ReSharper Anmerkungen verwenden, um dies zu beheben. ReSharper hat keine Möglichkeit zu wissen, wie lange die Schließung dauern wird, z. es könnte einem Feld zugewiesen werden, und so warnt es Sie, dass Sie möglicherweise etwas verwenden können, das zum Zeitpunkt des Aufrufs des Lambda entsorgt wird.

Sie können es wie folgt beheben:

void DoThisTwice([InstantHandle] Action action) 
{ 
    action(); 
    action(); 
} 

Das InstantHandle Attribut ReSharper sagt, dass die Aktion sofort aufgerufen wird und nicht über den Rahmen des Verfahrens gespeichert.

+0

* Genau * was ich gesucht habe! – chiccodoro

+0

Wow, sehr nett :) –