2016-08-15 37 views
1

我有一個函數,它將一個對象列表繪製到位圖上以創建一個粗略的地圖。代碼分析會拋出一條警告(CA2000),表示對象的drawPen不會沿着所有異常路徑進行處理。據我所知,它被放置在函數的末尾,並且沒有無法訪問的代碼可能會被忽略。在一次性對象上處理沒有正確調用

有誰知道爲什麼編譯器認爲它沒有正確處置?

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

你不是異常處理,所以在處理筆之前你的應用可能會拋出,使用'var('使用(var drawpen = new Pen())'或者用try塊來包裝你的代碼,處置筆 – Charleh

回答

2

你,因爲在你的函數的異常的drawPen不會配置的情況下獲得的警告。

你可以把你的代碼包裝在try finally和最後調用.Dispose()或更好的 - 使用using這正是。

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); 
      } 
     } 
    } 
} 

以上等同於:

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

你改變了什麼? –

+0

還在編輯答案 –

+0

啊,說得通。我忘記了使用對象的處理。謝謝 – MikeS159

2

試想一下,如果在創建筆和處理它的代碼拋出一個異常,會發生什麼情況。筆不會被丟棄。編譯器警告您要確保即使發生異常,筆也會被丟棄。你有兩種方法可以這樣做:usingtry...finally(這實際上是using的執行)。

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