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());
出处:http://www.cnblogs.com/haokaibo/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。