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());

  • 相关阅读:
    Spark SQL 编程API入门系列之SparkSQL数据源
    [转]Window2008站点安全设置,IIS7/IIS7.5中目录执行权限的设置方法
    [转]c# 对密码执行散列和 salt 运算方法
    [转]C#使用 Salt + Hash 来为密码加密
    [转]webservice 采用SSL实现加密传输
    [转]如何借助 TLS/SSL 确保套接字连接的安全(使用 C#/VB/C++ 和 XAML 的 Windows 应用商店应用)
    [转]网银在线支付接口和应用
    [转]支付宝接口程序、文档及解读(ASP.NET)
    [转]加盐hash保存密码的正确方式
    [转]如何安全的存储密码
  • 原文地址:https://www.cnblogs.com/haokaibo/p/2101475.html
Copyright © 2011-2022 走看看