2016-08-15 2 views
1

Ich habe eine Funktion, die eine Liste von Objekten auf eine Bitmap zeichnet, um eine grobe Karte zu erstellen. Die Codeanalyse gibt eine Warnung aus (CA2000), die besagt, dass das Objekt "drawPen" nicht auf allen Ausnahmepfaden angeordnet ist. Soweit ich sehen kann, ist es am Ende der Funktion angeordnet und es gibt keinen Code, der nicht zugänglich ist.Dispose nicht korrekt auf Einweg-Objekt

Weiß jemand, warum der Compiler denkt, dass es nicht richtig entsorgt wird?

public void drawUpdates(List<areaObjects> objectLocations) 
{ 
    Rectangle areaToClone = new Rectangle(0, 0, writeOnceMap.Width, writeOnceMap.Height); 
    var pixelFormat = writeOnceMap.PixelFormat; 
    areaBitMap = writeOnceMap.Clone(areaToClone, pixelFormat); 
    Pen drawPen = new Pen(Color.Black, 2); 
    drawPen.Width = 2; 
    foreach(areaObjectsop2d in objectLocations) 
    { 
     int xPosition = (int)(op2d.XYZ.xPos * mapScale); 
     int yPosition = (int)(op2d.XYZ.yPos * mapScale); 
     Point[] crossMarker = getCrossShape(xPosition, yPosition); 

     using (var graphics = Graphics.FromImage(areaBitMap)) 
     { 
      graphics.DrawPolygon(drawPen, crossMarker); 
     } 
    } 
    drawPen.Dispose(); 
} 
+3

Sie sind nicht Ausnahme so technisch App Umgang werfen könnte, bevor der Stift angeordnet ist, verwenden Sie 'mit (var drawpen = new Pen())' oder wickeln Sie den Code in einem Try-Catch mit einem finally-Block, dass verfügt über den Stift – Charleh

Antwort

2

Sie erhalten die Warnung, weil im Falle einer Ausnahme in der Funktion der drawPen nicht entsorgt werden.

Sie können Ihren Code in einer try finally und in der schließlich rufen Sie die .Dispose() oder besser - verwenden Sie die using, die genau das tut.

public void drawUpdates(List<areaObjects> objectLocations) 
{ 
    Rectangle areaToClone = new Rectangle(0, 0, writeOnceMap.Width, writeOnceMap.Height); 
    var pixelFormat = writeOnceMap.PixelFormat; 
    areaBitMap = writeOnceMap.Clone(areaToClone, pixelFormat); 
    using(Pen drawPen = new Pen(Color.Black, 2)) 
    { 
     foreach(areaObjectsop2d in objectLocations) 
     { 
      int xPosition = (int)(op2d.XYZ.xPos * mapScale); 
      int yPosition = (int)(op2d.XYZ.yPos * mapScale); 
      Point[] crossMarker = getCrossShape(xPosition, yPosition); 

      using (var graphics = Graphics.FromImage(areaBitMap)) 
      { 
       graphics.DrawPolygon(drawPen, crossMarker); 
      } 
     } 
    } 
} 

Obiges ist äquivalent zu:

Pen drawPen = new Pen(Color.Black, 2); 
try 
{ 
    /*Your code*/ 
} 
finally 
{ 
    drawPen.Dispose(); 
} 
+0

Was hast du geändert? –

+0

Immer noch die Antwort bearbeiten –

+0

Ah, macht Sinn. Ich hatte vergessen, dass die Verwendung des Objekts verwendet. Danke – MikeS159

2

Stellen Sie sich vor, was der Code passiert, wenn zwischen dem Stift zu schaffen, und es gibt eine Ausnahme aus entsorgen. Der Stift wird nicht entsorgt. Der Compiler warnt Sie, um sicherzustellen, dass der Stift auch dann entsorgt wird, wenn eine Ausnahme auftritt. Sie haben zwei Möglichkeiten dazu: using und try...finally (das ist die Implementierung von using).

using (Pen drawPen = ...) 
{ 
} // now the code makes sure it gets disposed