2016-08-15 10 views
1

私は粗マップを作成するためにオブジェクトのリストをビットマップに描画する関数を持っています。コード分​​析は、オブジェクト 'drawPen'がすべての例外パスに沿って配置されていないという警告(CA2000)をスローします。限り、私はそれが機能の最後に配置され、それが見逃す可能性のあるアクセスできないコードがないことがわかります。使い捨てオブジェクトで正しく処分されないDispose

コンパイラがそれが適切に処理されていないと思う理由を知っている人はいますか?

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

あなたのアプリがペンが破棄される前に例外的に処理することはできませんので、 'use(var drawpen = new Pen())'を使用するか、try catchでコードをラップしてペンを処分する – 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の2通りの方法があります(実際はusingの実装です)。

using (Pen drawPen = ...) 
{ 
} // now the code makes sure it gets disposed 
関連する問題