为了账号安全,请及时绑定邮箱和手机立即绑定

“使用”语句与“最终尝试”

“使用”语句与“最终尝试”

慕容3067478 2019-10-18 14:55:49
我有一堆将要使用读/写锁的属性。我可以使用a try finally或using子句实现它们。在中,try finally我将在之前获取锁,然后在中try释放finally。在该using子句中,我将创建一个在其构造函数中获取锁并在其Dispose方法中释放该锁的类。我在许多地方都使用了读/写锁,因此我一直在寻找比更为简洁的方法try finally。我很想听听一些关于为什么可能不推荐一种方法,或者为什么一种方法可能比另一种更好的想法。方法1(try finally):static ReaderWriterLock rwlMyLock_m  = new ReaderWriterLock();private DateTime dtMyDateTime_mpublic DateTime MyDateTime{    get    {        rwlMyLock_m .AcquireReaderLock(0);        try        {            return dtMyDateTime_m        }        finally        {            rwlMyLock_m .ReleaseReaderLock();        }    }    set    {        rwlMyLock_m .AcquireWriterLock(0);        try        {            dtMyDateTime_m = value;        }        finally        {            rwlMyLock_m .ReleaseWriterLock();        }    }}方法2:static ReaderWriterLock rwlMyLock_m  = new ReaderWriterLock();private DateTime dtMyDateTime_mpublic DateTime MyDateTime{    get    {        using (new ReadLock(rwlMyLock_m))        {            return dtMyDateTime_m;        }    }    set    {        using (new WriteLock(rwlMyLock_m))        {            dtMyDateTime_m = value;        }    }}public class ReadLock : IDisposable{    private ReaderWriterLock rwl;    public ReadLock(ReaderWriterLock rwl)    {        this.rwl = rwl;        rwl.AcquireReaderLock(0);    }    public void Dispose()    {        rwl.ReleaseReaderLock();    }}public class WriteLock : IDisposable{    private ReaderWriterLock rwl;    public WriteLock(ReaderWriterLock rwl)    {        this.rwl = rwl;        rwl.AcquireWriterLock(0);    }    public void Dispose()    {        rwl.ReleaseWriterLock();    }}
查看完整描述

3 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

从MSDN,使用Statement(C#参考)


using语句确保即使在调用对象的方法时发生异常,也将调用Dispose。通过将对象放在try块中,然后在finally块中调用Dispose,可以达到相同的结果。实际上,这就是编译器翻译using语句的方式。前面的代码示例在编译时扩展为以下代码(请注意,额外的花括号可创建对象的有限作用域):


{

  Font font1 = new Font("Arial", 10.0f);

  try

  {

    byte charset = font1.GdiCharSet;

  }

  finally

  {

    if (font1 != null)

      ((IDisposable)font1).Dispose();

  }

}

因此,基本上,这是相同的代码,但是具有很好的自动空检查和变量的额外作用域。该文档还指出,它“确保IDisposable对象的正确使用”,因此您将来也可能会为任何晦涩的情况获得更好的框架支持。


因此,选择选项2。


将变量包含在不再需要的范围内立即结束的作用域也是一个加号。


查看完整回答
反对 回复 2019-10-18
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

考虑这两种解决方案都不好,因为它们掩盖了异常的可能性。


try没有a的A catch显然是个坏主意;请参阅MSDN,以了解该using声明为何同样危险。


另请注意,Microsoft现在建议使用ReaderWriterLockSlim而不是ReaderWriterLock。


最后,请注意,Microsoft示例使用两个try-catch块来避免这些问题,例如


try

{

    try

    {

         //Reader-writer lock stuff

    }

    finally

    {

         //Release lock

    }

 }

 catch(Exception ex)

 {

    //Do something with exception

 }

一个简单,一致,干净的解决方案是一个不错的目标,但是假设您不能仅使用lock(this){return mydateetc;},您可能会重新考虑该方法。有了更多信息,我相信堆栈溢出可以提供帮助;-)


查看完整回答
反对 回复 2019-10-18
  • 3 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信