【发布时间】:2015-08-04 13:30:28
【问题描述】:
我有一个班级 MyClass。我想在 using 语句中创建 MyClass 实例并在构造函数中操作 1,但是如果实例是在 using 语句中与 MyClass 的其他实例嵌套创建的,我想做一些事情 2。我不知道如何检查它。我想到了静态类,它检查当前代码语句是否是从使用 MyClass 的其他实例的语句中收集的,但我不知道如何检查它。
public class MyClass : IDisposable
{
public MyClass()
{
if(condition)
//do something 1
else
//do something 2
}
public void Dispose()
{
//do something
}
}
using (var mc = new MyClass()) //do something 1 in constructor
{
using (var mc1 = new MyClass()) //do something 2 in constructor
{
using (var mc2 = new MyClass()) //do something 2
{
}
}
using (var mc3 = new MyClass()) //do something 2 in constructor
{
}
编辑: 我尝试做某种范围。它应该是比 TransactionScope 更大的范围。在我的范围内,我想拥有 fiew TransactionScopes。我想在整个范围内使用与数据库相同的连接而不将其返回到连接池。因此,当我在 using 语句中创建主要范围时,我想从池中获取新的连接,但是如果我使用我的范围创建嵌套的 using 块,我想使用来自主要范围的连接。嵌套是可行的,因为在可能的主要 using 块中,我可以在我的范围内运行包含另一个 using 块的方法。
【问题讨论】:
-
不要在构造函数中做事
-
我不明白这个问题。此外,您正在同一范围内重新定义相同的变量
mc。 -
除了是非常糟糕的设计之外,这实际上是不可能的,因为编译器会破坏您的代码并以不同的方式重构它。 using 语句是花哨的 try/finally 自动处理的语法糖。
-
这只是一个简单的例子来说明我需要做什么,但它可能更复杂,所以我不能调用具体方法,因为我不知道这段代码是否是嵌套与否
-
你使用你的类的地方应该告诉它如何被构造,你的类不应该试图检测它是如何被使用的,并据此执行不同的逻辑。编译器优化无论如何都会修改代码,因此它在文本编辑器中的编写方式通常不是它的编译方式。如果您需要基于某些东西运行逻辑,则应该将参数传递给您的类。虽然这看起来像 X-Y 问题,但您需要告诉我们您真正想要解决的问题是什么,为什么需要这个。