2012-04-12 16 views
4

resharper bietet mir diese eine lokale Variable zu machen, und „Zugang zu modifizierten Verschluss“, schreibtWarum lokale Variable?

if (filter != null) 
{ 
    if (filter.CityId != 0) 
    { 
     ads = ads.Where(x => x.Ad.CityId == filter.CityId); 
    } 
    if (filter.BusinesCategoryId != 0) 
    { 
     ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId); 
    } 
} 

Warum lokale tun variable Filter?

+2

Welche lokale Variable, 'ads'? – Tigran

Antwort

6

Da Ihre Abfrage (Where (...)) nicht ausgeführt wird. Ich nehme an, Filter wird von einer Schleife erhalten?

Linq Abfrage wird nicht ausgeführt, bis sie verwendet werden. Wenn Sie also eine Reihe von Filtern durchforsten und später mit der Ausführung beginnen, ist der Filterwert in der Abfrage falsch.

Eine ähnliche Frage: Access to Modified Closure auch: http://devnet.jetbrains.net/thread/273042

müßte mehr Code zu 100% sicher zu sehen.

+0

es ist gefährlich, wenn es einen Zyklus gibt? Ich fahre nicht Fahrrad. – Mediator

+2

Verschlüsse können ohne Schleife geändert werden. Die Schleife ist die häufigste Ursache für unbeabsichtigt geänderte Abschlussvariablen, ist aber nicht die einzige Ursache. – phoog

3

Aus wie ich das verstehe, wird Resharper einen Fehler auslösen, wenn Sie auf eine Variable von einem Delegaten (Schließung) zugreifen, und ändern Sie dann die Variable, bevor Sie den Delegaten ausführen. Dies geschieht meist, wenn Sie auf eine for-Schleifenvariable in einem Delegaten/Lambda zugreifen und diese außerhalb der Schleife ausführen. Wenn Ihr Code lautet:

foreach (filter in filters) 
{ 
     if (filter != null) { 
      if (filter.CityId != 0)  { 
       ads = ads.Where(x => x.Ad.CityId == filter.CityId); 
      } 
      if (filter.BusinesCategoryId != 0)  { 
       ads = ads.Where(x => x.BusinessCategoryId == filter.BusinesCategoryId); 
      } 
     } 
} 
return ads.ToList() 

Dann wird es sich nicht so verhalten, wie Sie es erwarten würden. Aber wenn Sie die Lambda-Ausdrücke innerhalb des Loop-Bereichs ausführen, hätten Sie kein Problem.

I wont erklären, warum es so verhält, weil eine Menge Leute es schon sehr gut erklärt:

UPDATE: Um zu antworten "Warum lokale Variable?" ist, weil die Behebung des obigen Problems eine lokale Variable verwendet (d. h. innerhalb der Schleife) und diese in Ihrem Lambda verwendet. Auf diese Weise schließen Sie die verschiedenen Instanzen der Variablen für jede Instanz des Lambda.