代码改变世界

Effective C# 学习笔记(十六)尽量少的创建对象,给GC减减负

2011-07-08 22:12  小郝(Kaibo Hao)  阅读(393)  评论(0编辑  收藏  举报

频繁的使用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());