我有很多属性,我将使用读/写锁.我可以用try finallyusing条款来实现它们.

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

我在很多地方使用读/写锁,所以我一直在寻找比try finally更简洁的方法.我很想听一些关于为什么一种方法可能不被推荐,或者为什么一种方法可能比另一种方法更好的 idea .

方法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,using Statement (C# Reference)

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

所以基本上是it is the same code but with a nice automatic null-checks and an extra scope for your variable.该文档还声明,它"确保IDisposable对象的正确使用",因此,对于future 任何不明确的情况,您都可以获得更好的框架支持.

所以 Select 2.

变量inside a scope在不再需要后立即结束也是一个加号.

.net相关问答推荐

Azure Function应用程序-如何升级.NET运行时

为什么 ULong > 16 位的数学会变得不稳定?

dotnet ef dbcontext scaffold command --data-annotations 或 -d 命令行参数似乎不起作用

是否有任何为 C# 编写的模糊搜索或字符串相似函数库?

如何在没有抽象基类的情况下强制覆盖后代中的方法?

将毫秒转换为人类可读的时间间隔

string.Format 如何处理空值?

app.config 文件和 XYZ.settings 文件有什么区别?

Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射

您可以在 C# 代码中捕获本机异常吗?

在 C# 中使用委托

从 C# 中的接口继承 XML 注释

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

string.Empty vs null.你用哪一个?

使用+运算符的字符串连接

在 .Net 中调用 Web 服务时绕过无效的 SSL 证书错误

.NET 的 XPath 和 XSLT 2.0?

如何判断uri字符串是否有效

实体框架太慢了.我有哪些 Select ?

连接字符串而不是使用一堆 TextBlocks