5

在下面的示例中,返回的pen是否会被销毁(处置)?

' VB'
Public Function GetPen() As System.Drawing.Pen
  Using pen As New System.Drawing.Pen(_Color, _Width)
    pen.DashStyle = _DashStyle
    Return pen
  End Using
End Function

// C#
public System.Drawing.Pen GetPen()
{
    using (System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)) 
    {
        pen.DashStyle = _DashStyle;
        return pen;
    }
}

[编辑]

再精确一点…… Pen 对象是通过引用发送给 GetPen 的调用者还是像结构一样“克隆”?我知道,这是一个类,但对于 GDI 对象,我永远不确定......

当外部方法将 Disposepen获得的时,它会被销毁(处置)吗?GetPen()penGetPen()

4

11 回答 11

7

是的,它会被处理掉。然后您将其以处置状态返回,因此它对任何事情都没有任何好处。如果你想使用这样的工厂方法返回一个Pen实例,你需要自己在方法外部处理它,而不是using在这样的方法中使用块。

于 2010-01-13T14:50:40.867 回答
6

Pen 不一定会被垃圾收集,但它会调用它的 Dispose() 方法。

于 2010-01-13T14:50:54.360 回答
3

是的,笔将被丢弃。不过,这确实是个坏主意。你退回一支已经废弃的笔!

您要做的是从 GetPen 中删除 Using 语句。GetPen 调用者应使用 Using 语句:

Using pen As Pen = GetPen()
    ''// Draw with this pen
End Using

或者在 C# 中:

using(Pen pen = GetPen())
{
    // Draw with this pen
}

[编辑]

是的,返回调用方法的引用,而不是副本。这就是为什么如果您在 GetPen 中处理笔,则不能在调用方法中使用该笔;-)

因为GetPen和调用方法指向同一个Pen对象,所以只需要在调用方法中调用Dispose即可。

于 2010-01-13T14:51:00.400 回答
3

笔将在返回前被处理掉。它相当于

public System.Drawing.Pen GetPen()
{
    try
    {
      System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width);

      pen.DashStyle = _DashStyle;
    }
    finally
    {
      pen.Dispose();
    }
    return pen;

}
于 2010-01-13T14:52:17.993 回答
1

是的,它会被处理掉。

于 2010-01-13T14:51:00.930 回答
1

退货完成后会自动处理掉。使用强制使用 Dispose() 隐含

于 2010-01-13T14:51:52.003 回答
1

是的。

返回的 Pen 对象将在调用者收到之前被 Disposed。

Get()样式方法中,您不想处理对象的处理。允许调用者在完成对象处理对象。我希望调用函数看起来像这样:

using(Pen myPen = GetPen())
{
    // My code here.
}
于 2010-01-13T14:53:08.540 回答
1

您的代码需要采用不同的结构,因为您要返回一个然后立即处理掉的对象。

public System.Drawing.Pen GetPen() 
{ 
    System.Drawing.Pen pen = new System.Drawing.Pen(_Color, _Width)
    { 
        DashStyle = _DashStyle; 
    } 
    return pen; 
} 

然后使用以下命令调用它:

using (System.Drawing.Pen pen = GetPen())
{
    //Do stuff with your pen...
}
于 2010-01-13T14:57:48.297 回答
0

您的Pen对象将在返回完成之前被处置,并且您将留下一个处于无效状态的笔对象。

于 2010-01-13T14:53:08.507 回答
0

是的。在代码的 C# 和 VB.net 版本中,在函数返回之前调用 .Dispose() 方法。这与销毁它(对象仍然存在)不同,但对于所有实际目的,该对象是无用的,因为使它变得有趣和有用的非托管资源现在被释放了。

在函数内构建 IDisposable 资源时使用的正确模式是只返回它,并使用 using 声明来调用函数,如下所示:

public System.Drawing.Pen GetPen()
{
    var pen = new System.Drawing.Pen(_Color, _Width)) 
    pen.DashStyle = _DashStyle;
    return pen;
}

public void FunctionThatCallsGetPen()
{
    using (System.Drawing.Pen pen = GetPen())
    {
       //use pen here
    }
}
于 2010-01-13T14:54:36.350 回答
0

using is 大致等于以下语句:

尝试 {

     var something = new something() ;

}

最后 {

 if (something != null)
 { something.Dispose();}   

}

于 2010-01-13T14:56:32.540 回答