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

我有一堆将要使用读/写锁的属性。我可以使用a try finally或using子句实现它们。


在中,try finally我将在之前获取锁,然后在中try释放finally。在该using子句中,我将创建一个在其构造函数中获取锁并在其Dispose方法中释放该锁的类。


我在许多地方都使用了读/写锁,因此我一直在寻找比更为简洁的方法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();

    }

}


慕容3067478
浏览 526回答 3
3回答

尚方宝剑之说

从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。将变量包含在不再需要的范围内立即结束的作用域也是一个加号。

慕田峪4524236

考虑这两种解决方案都不好,因为它们掩盖了异常的可能性。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;},您可能会重新考虑该方法。有了更多信息,我相信堆栈溢出可以提供帮助;-)
打开App,查看更多内容
随时随地看视频慕课网APP