在.NET中使用'using'

ser*_*hio 5 .net using

在下面的例子中,返回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;
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

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

将它被破坏(设置)的pen中创建GetPen()当外部方法将其废弃pen用得到GetPen()

Dav*_*d M 7

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

  • 你仍然可以使用:`using(Pen p = GetAPen()){...}` (3认同)

kem*_*002 6

笔不一定是垃圾收集,但它会调用Dispose()方法.


Met*_*ght 3

是的,笔将被丢弃。但这确实是一个坏主意;您归还一支已经处理掉的笔!

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

Using pen As Pen = GetPen()
    ''// Draw with this pen
End Using
Run Code Online (Sandbox Code Playgroud)

或者在 C# 中:

using(Pen pen = GetPen())
{
    // Draw with this pen
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

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

由于GetPen和调用方法指向同一个Pen对象,因此只需在调用方法中调用Dispose即可。