zoukankan      html  css  js  c++  java
  • Effective C# 学习笔记(十六)尽量少的创建对象,给GC减减负

    频繁的使用GC回收大量垃圾会使你的程序变得很慢,这时你要优化你的设计,构建复用的对象和在使用时才初始化的方法可以帮助你为GC减负。

    例如有一个刷子类,其由很多刷子组成,每次使用的刷子时其各个颜色的刷子没有必要一次都创建出来,使用哪个创建哪个,创建好后就存储下来,以备下次使用时调用,而不必创建新的对象。代码如下:

    private static Brush blackBrush;

    public static Brush Black

    {

    get

    {

    if (blackBrush == null)

    blackBrush = new SolidBrush(Color.Black);

    return blackBrush;

    }

    }

    其次尽量少地在被频繁调用的方法里使用过多的局部变量,可以将这些变量放到你的类的成员变量中,存储起来,以便下次调用不必创建新的对象。代码如下:

    private readonly Font myFont = new Font("Arial", 10.0f);

    protected override void OnPaint(PaintEventArgs e)

    {

    e.Graphics.DrawString(DateTime.Now.ToString(),

    myFont, Brushes.Black, new PointF(0, 0));

    base.OnPaint(e);

    }

     

    再有就是通过创建mutable builder 来处理 immutable对象的多次构建问题。

     

    例如:string对象的多步创建,下面的两段代码说明了string对象多步创建的问题:

     

    string msg = "Hello, ";

    msg += thisUser.Name;

    msg += ". Today is ";

    msg += System.DateTime.Now.ToString();

    is just as inefficient as if you had written this:

    string msg = "Hello, ";

     

    // Not legal, for illustration only:

    string tmp1 = new String(msg + thisUser.Name);

    msg = tmp1; // "Hello " is garbage.

    string tmp2 = new String(msg + ". Today is ");

    msg = tmp2; // "Hello <user>" is garbage.

    string tmp3 = new String(msg + DateTime.Now.ToString());

    msg = tmp3; // "Hello <user>. Today is " is garbage.

     

    在这种情景下,你最好使用StringBuilder这个mutable builder 来处理 immutable 对象的多次构建问题。

    StringBuilder msg = new StringBuilder("Hello, ");

    msg.Append(thisUser.Name);

    msg.Append(". Today is ");

    msg.Append(DateTime.Now.ToString());

    string finalMsg = msg.ToString();

     

    在简单情况下,还可以使用如下代码简化多步创建immutable对象问题。

    string msg = string.Format("Hello, {0}. Today is {1}",thisUser.Name, DateTime.Now.ToString());

  • 相关阅读:
    XML to Excel
    C# 位域[flags]
    使用windows7的System帐户
    VS.NET 控件命名规范
    Microsoft Robotics Studio到底能做什么?
    SQLServer系统表及其应用(转)
    利用xslt、xml,ajax实现了一个无限级树型导航
    利用xslt实现一个树形导航
    网页信息抓取如何获取延迟加载的网页数据
    站长盈利盈利方式面面观
  • 原文地址:https://www.cnblogs.com/haokaibo/p/2101475.html
Copyright © 2011-2022 走看看