C# 在一次性对象上未正确调用Dispose

C# 在一次性对象上未正确调用Dispose,c#,idisposable,C#,Idisposable,我有一个函数,它将对象列表绘制到位图上,以创建一个粗略的贴图。代码分析抛出一个警告(CA2000),表示对象“drawPen”未沿所有异常路径释放。据我所知,它是在函数的末尾处理的,并且没有不可访问的代码可能会丢失 有人知道为什么编译器认为它没有被正确处理吗 public void drawUpdates(List<areaObjects> objectLocations) { Rectangle areaToClone = new Rectangle(0, 0, write

我有一个函数,它将对象列表绘制到位图上,以创建一个粗略的贴图。代码分析抛出一个警告(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();
}
public void drawUpdates(列出objectLocations)
{
矩形区域克隆=新矩形(0,0,WriteOnCap.Width,WriteOnCap.Height);
var pixelFormat=writeOnceMap.pixelFormat;
areaBitMap=writeOnceMap.Clone(areaToClone,像素格式);
Pen drawPen=新笔(颜色:黑色,2);
绘图笔。宽度=2;
foreach(objectLocations中的AreaObjectsP2D)
{
int xPosition=(int)(op2d.XYZ.xPos*mapScale);
int yPosition=(int)(op2d.XYZ.yPos*mapScale);
点[]交叉标记=getCrossShape(xPosition,yPosition);
使用(var graphics=graphics.FromImage(areaBitMap))
{
图形。DrawPolygon(drawPen、crossMarker);
}
}
drawPen.Dispose();
}

您会收到警告,因为在功能异常的情况下,
绘图笔将不会被处理

您可以在
try finally
和finally调用
.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);
    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);
            }
        }
    }
}

您会收到警告,因为在函数出现异常的情况下,
drawPen
将不会被处理

您可以在
try finally
和finally调用
.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);
    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);
            }
        }
    }
}

想象一下,如果在创建笔和处理笔之间的代码抛出异常,会发生什么。这支笔不会被处理掉。编译器警告您确保即使发生异常,笔也会被释放。有两种方法可以做到这一点:
使用
尝试…最后
(这实际上是
使用
的实现)


想象一下,如果在创建笔和处理笔之间的代码抛出异常,会发生什么。这支笔不会被处理掉。编译器警告您确保即使发生异常,笔也会被释放。有两种方法可以做到这一点:
使用
尝试…最后
(这实际上是
使用
的实现)


你不是异常处理,所以从技术上讲,你的应用程序可以在笔被释放之前抛出,使用
using(var drawpen=new pen())
或者用一个finally块将你的代码包装在一个try catch中,最后一个块处理笔你不是异常处理,所以从技术上讲,你的应用程序可以在笔被释放之前抛出,使用
using(var drawpen=new pen()))
或者用finally块将代码包装在try-catch中,该块用于处理笔您更改了什么?啊,很有意义。我忘了使用这个东西是有好处的。Thanks@Mike159-
Graphics.FromImage1
例如,可能会抛出一个空参数异常:)@GiladGreen在一系列方法调用之前执行空引用检查,但我将更改执行位置,因为当前实现没有很好地封装。等待答复的时间期限到期:)你改变了什么?啊,有道理。我忘了使用这个东西是有好处的。Thanks@Mike159-
Graphics.FromImage1
例如,可能会抛出一个空参数异常:)@GiladGreen在一系列方法调用之前执行空引用检查,但我将更改执行位置,因为当前实现没有很好地封装。正在等待响应时间限制到期:)
using (Pen drawPen = ...)
{
} // now the code makes sure it gets disposed