在下面的例子中,返回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()?
是的,它将被处置.然后你将它处于处置状态,因此对任何事情都没有任何好处.如果你想使用这样的工厂方法来返回一个Pen实例,你需要处理自己在方法外部处理它,而不是using像这样在方法中使用块.
是的,笔将被丢弃。但这确实是一个坏主意;您归还一支已经处理掉的笔!
您要做的就是从 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即可。