加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#使用语句更加了解

发布时间:2020-12-15 18:13:26 所属栏目:百科 来源:网络整理
导读:有人可以帮我理解下面的代码 public Font MyFont { get; set; }void AssignFont(){ using (Font f = new Font("Shyam",2)) { this.MyFont = f; }} 将处置对象分配给MyFont属性是否有效? 解决方法 虽然它可能“有效地将已处置的对象分配给MyFont属性”,但该
有人可以帮我理解下面的代码
public Font MyFont { get; set; }

void AssignFont()
{
    using (Font f = new Font("Shyam",2))
    {
        this.MyFont = f;
    }
}

将处置对象分配给MyFont属性是否有效?

解决方法

虽然它可能“有效地将已处置的对象分配给MyFont属性”,但该对象可能不再有用,因为它可能已释放托管和/或非托管资源.在using语句的开头实例化的对象表明该对象的底层类实现了IDisposable接口.这应该被视为一个警告标志,当对象被处置时,你应该真的停止与它交互,包括保持对它的引用.

对于字体,退出using块时会处理字体的底层资源:

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); // <--- 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 (Font f = new Font("Shyam",2))
{
    this.MyFont = f;
}

更好:

this.MyFont = new Font("Shyam",2)

我怀疑的字体使用原生字体,因此是资源.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读