c#匿名类逃避内部范围块的任何方式?

Cod*_*ien 4 c# anonymous-types

我想使用一个匿名类,但在using代码块中实例化并让它逃脱阻止.这可能吗?

例如,我有

using (var s = something()) {
   var instance = new { AA = s.A };
   // ... lots of code
   Console.WriteLine(instance.AA);
}
Run Code Online (Sandbox Code Playgroud)

我宁愿有类似的东西:

var instance;  // <- nope, can't do this
using (var s = something()) {
   instance = new { AA = s.A };
}
// ... lots of code
Console.WriteLine(instance.AA);
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 8

轻松完成:

var instance = new { Name = default(string) };
using (whatever) 
{
  instance = new { Name = whatever.Whatever() };
}
...
Run Code Online (Sandbox Code Playgroud)

但这里更好的做法是创建一个实际的类.

或者,在C#7中,考虑使用元组.

现在,如果你想得到真正的幻想......

static R Using<A, R>(A resource, Func<A, R> body) where A : IDisposable
{
    using (resource) return body(resource);
}
...

var instance = Using(something(), s => new { AA = s.A });
Run Code Online (Sandbox Code Playgroud)

但这看起来很傻.刚上课!

  • @Servy:你是对的.但是我注意到`using`已经有了这个问题.考虑`using(foo())bar();`这在逻辑上与`var x = foo(); 试试{bar(); } finally {if(x!= null)(IDispose)x; }`.假设`foo()`在*分配了非托管资源之后抛出*; 然后永远不会输入try块.假设在`foo()`的返回和对`x`的赋值之间抛出`ThreadAbortException`.`using`现在不是,并且从未保证资源在有例外的世界中被处置. (2认同)