识别包含使用块

Identify the encompassing using block

提问人:Gigi 提问时间:3/29/2023 更新时间:3/29/2023 访问量:34

问:

如何识别调用链的包含使用块?我的意思是不要将使用块创建的对象保存在静态或全局中,也不要传递它。如果我有:

using(new Foo())
{
    A();
}
void A()
{
    B();
}

在函数 B 中,我希望能够识别和访问 Foo 实例。如果有的话,也可以使用块获得上部包罗万象,等等,那就更好了。

C# 使用语句

评论

1赞 wohlstad 3/29/2023
我怀疑这是否可能。将它作为参数传递有什么问题?
0赞 ProgrammingLlama 3/29/2023
不,那是不可能的。您必须先将引用传递给 into,然后传递到 into 。FooAB
0赞 Gigi 3/29/2023
@wohlstad 上面的例子很简单,但想象一下长调用链,想象一下在每个方法中你都有许多其他函数调用,想象一下这些方法已经有一些其他参数,你希望调用链中的任何地方都知道周围的使用块。
1赞 Good Night Nerd Pride 3/29/2023
通过参数传递实例是最干净、最易于维护的解决方案。如果你最终通过一系列方法转发它,并且只有最深的调用真正使用它,那么你可能需要重新考虑你的设计。不幸的是,没有灵丹妙药可以解决这个问题。Foo

答:

3赞 Marc Gravell 3/29/2023 #1

没有神奇的方法来获取环境状态,特别是如果你明确排除了静态/异步局部变量之类的东西。

所以:把它传进去。如果需要知道 ,则:B 需要知道 Foo;不要让它变魔术 - 通过传入它来使其明确和简单:BFoo

using (Foo foo = new())
{
    A(foo);
}


void A(Foo foo) => B(foo);

(是的,我知道你也说过“也不传递它”,但 IMO 这是最合适的解决方案)