我有一堆将要使用读/写锁的属性。我可以使用a try finally或using子句实现它们。
try finally
using
在中,try finally我将在之前获取锁,然后在中try释放finally。在该using子句中,我将创建一个在其构造函数中获取锁并在其Dispose方法中释放该锁的类。
try
finally
我在许多地方都使用了读/写锁,因此我一直在寻找比更为简洁的方法try finally。我很想听听一些关于为什么可能不推荐一种方法,或者为什么一种方法可能比另一种更好的想法。
方法1(try finally):
static ReaderWriterLock rwlMyLock_m = new ReaderWriterLock(); private DateTime dtMyDateTime_m public 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_m public 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(); } }
从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。
将变量包含 在 不再需要 的范围内 立即结束 的作用域 也是一个加号。