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