您将欣赏以下两种语法糖:

lock(obj)
{
//Code
}

same as:

Monitor.Enter(obj)
try
{
//Code
}
finally
{
Monitor.Exit(obj)
}


using(var adapt = new adapter()){
//Code2
}

same as:

var adapt= new adapter()
try{
//Code2
}
finally{
adapt.Dispose()
}

显然,每种情况下的第一个示例都更具可读性。是否可以使用C#语言或IDE自行定义此类内容?我问的原因是,有很多类似的用法(很长的用法)可以从中受益,例如。如果使用ReaderWriterLockSlim,则需要类似的东西。

编辑1:

我被要求提供一个例子,所以我去尝试一下:
myclass
{
ReaderWriterLockSlim rwl = new ReaderWriterLockSlim();

void MyConcurrentMethod()
{
  rwl.EnterReadLock();
  try{
    //Code to do in the lock, often just one line, but now its turned into 8!
  }
  finally
  {
    rwl.ExitReadLock();
  }
}
}

//I'd rather have:
void MyConcurrentMethod()
{
rwl.EnterReadLock()
{
   //Code block. Or even simpler, no brackets like one-line ifs and usings
}
}

当然,您必须考虑如何使用TryEnterReadLocks以及带有返回值的这类东西。但我敢肯定,您会想到些什么。

最佳答案

不完全是,但是您可以使用 Action 委托(delegate)来完成一些事情:

void MyBrace(Action doSomething)
{
     try
     {
        //wait for lock first

        doSomething();
     }
     finally
     {
         //special cleanup
     }
}

并像这样使用它:
MyBrace(() =>
{
   //your code goes here, but won't run until the lock is obtained
});  // cleanup will always run, even if your code throws an exception

请注意,这有一些限制。例如,在新花括号内不能包含有意义的return语句。多亏了闭包,您至少仍然可以使用局部变量。

关于c# - 这个功能存在吗?在C#中定义我自己的花括号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2882983/

10-11 01:09