chiname

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

使用 using 语句算不算最佳实践

17 号下午参加了微软的笔试,从武汉返回长沙的路上不由的琢磨里面的题目,从试卷来看,考试的范围没有象网上流行的那些微软智力题目,基本上都是很基础的东西。

 

不过有一道涉及.net 的题目到让我犹豫不小。原题记不起来了:大意是 C++CLR 在内存管理方面的有什么不同?选项里面有一条是:对于非托管的对象,使用 using 语句是最佳实践。

 

 在C#中使用using语句可以使得那些实现了IDisposable接口类型有更为简化的异常处理方式,编译器自动产生一个try块和finally块,并在finally块中将变量转换成为一个IDisposable接口。

 

然而频繁的调用Dispose对于垃圾收集器来说会加大其负担,《Effective C#: 50 Specific Ways to Improve Your C#》里也有两个Item讨论涉及到了using语句的使用场景,其中Item 16: Minimize Garbage给出了频繁的垃圾收集带来的负面影响,原书给出的示例代码:

protected override void OnPaint( PaintEventArgs e )
{
 // Bad. Created the same font every paint event.
   using ( Font MyFont = new Font( "Arial", 10.0f ))
  {
   e.Graphics.DrawString( DateTime.Now.ToString(),
    MyFont, Brushes.Black, new PointF( 0,0 ));
  }
   base.OnPaint( e );
}

 

方法OnPaint在每次刷新时候都被调用到,那么每次调用时候都会创建一个新的Font对象,尽管这些对象都是相同的设置。

所以最好写成:

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

基于这样的考虑,选择答案时候我不得不犹豫一会,最后还是认同了“最佳实践的说法”,如果是你选择呢?

 

ps:我想疑惑的根源在于对“最佳实践”的理解吧。

posted on 2005-10-21 09:42  把我的欢乐带给你  阅读(148)  评论(0)    收藏  举报