有人能帮我理解以下代码吗?
public Font MyFont { get; set; }
void AssignFont()
{
using (Font f = new Font("Shyam",2))
{
this.MyFont = f;
}
}
将一个正在被处理的对象分配给MyFont
属性是有效的吗?
using
语句块开头实例化的对象表示对象的基础类实现了IDisposable
接口。这应视为一个警告信号,当对象被释放时,你应该停止与它进行交互,包括保留对它的引用。using (Font f = new Font("Shyam",2))
{
this.MyFont = f;
}
如果您尝试在任何绘图操作中使用该字体,就可以轻松证明这一点。
如果该字体已被处理,以下代码将失败并出现System.ArgumentException
:
public partial class UserControl1 : UserControl
{
public UserControl1()
{
InitializeComponent();
}
private void UserControl1_Load(object sender, EventArgs e)
{
if (DesignMode)
{
return;
}
AssignFont();
}
#region Overrides of Control
/// <summary>
/// Raises the <see cref="E:System.Windows.Forms.Control.Paint"/> event.
/// </summary>
/// <param name="e">A <see cref="T:System.Windows.Forms.PaintEventArgs"/> that contains the event data. </param>
protected override void OnPaint(PaintEventArgs e)
{
try
{
var g = e.Graphics;
g.FillRectangle(Brushes.White, e.ClipRectangle);
g.DrawString("Hi there", MyFont, Brushes.Black, 0, 0); // <--- this will fail
}
catch (Exception ex)
{
Trace.TraceError(ex.Message);
}
}
#endregion
void AssignFont()
{
using (Font f = new Font("Shyam", 2))
{
this.MyFont = f;
} // <---- MyFont now points to a disposed object
}
public Font MyFont { get; set; }
}
你的代码问题在于你在一个使用块中分配了某些内容,并将其引用到其他地方。在你的情况下,因为你想要在其他地方使用这个字体,所以使用 using
块是没有意义的。
using (Font f = new Font("Shyam",2))
{
this.MyFont = f;
}
this.MyFont = new Font("Shyam",2)
我怀疑字体使用本地字体,因此需要资源。
using
块之外使用一次性对象。大多数情况下,一次性对象在被处理后就无法继续使用了。如果您遵循这个规则,您会少遇到麻烦。using
,因为您希望在AssignFont
方法之外使用字体对象。Disposed
事件上处理字体(假设this
是一个控件)。但是,除非您的应用程序生命周期内生成了成千上万个字体,否则您很可能根本不需要处理字体。如果您只有5-10个字体,则处理它们不应该成为一个大问题。
MyFont
属性是否有效?”不过我会等待提问者编辑问题以澄清。 - Peter Duniho