在C#中调用任何其他方法时,如何自动重置布尔值?
如果在函数在C#中调用任何其他方法时,如何自动重置布尔值?,c#,set,call,flags,C#,Set,Call,Flags,如果在函数C()之前调用了函数A(),那么使用C#,我需要做一些额外的工作。如果在A()和C()之间调用了任何其他函数,那么我不想做额外的工作。任何需要最少代码重复的想法 我试图避免添加像flag=false这样的行进入每个函数B1。BN 下面是一个非常基本的例子: bool flag = false; void A() { flag = true; } void B1() { ... } void B2() { ... } void C() { if (
C()
之前调用了函数A()
,那么使用C#,我需要做一些额外的工作。如果在A()
和C()
之间调用了任何其他函数,那么我不想做额外的工作。任何需要最少代码重复的想法
我试图避免添加像flag=false这样的行代码>进入每个函数B1
。BN
下面是一个非常基本的例子:
bool flag = false;
void A()
{
flag = true;
}
void B1()
{
...
}
void B2()
{
...
}
void C()
{
if (flag)
{
//do something
}
}
上面的例子只是使用了一个简单的例子,但我愿意使用布尔以外的东西。重要的是,我希望能够设置和重置一个排序标志,以便C()
知道如何相应地进行操作
谢谢你的帮助。如果您需要澄清,我将编辑我的帖子。为什么不将您的“额外工作”考虑到一个备忘录功能(即缓存其结果的功能)?无论何时,只要调用这个函数,如果缓存是新的,它就会短路。每当该工作过时时,请使缓存无效。在上面相当奇怪的示例中,我假设您需要在每个B中调用一个函数,在C中调用一个函数。对a的调用将使缓存无效
如果您正在寻找解决这个问题的方法(即捕获所有函数调用并插入此调用的聪明方法),我真的不会费心。我可以想象一些疯狂的运行时反射代理类生成,但是您应该使代码流清晰明了;如果每个函数都依赖于已经完成的工作,那么只需在每个函数中调用“doWork”。如果调用一个方法会改变另一个方法的行为,因此必须确保以正确的顺序调用它们,那么听起来您的设计是紧密耦合的。这是一个重大的危险信号
听起来好像需要进行一些重构。在没有看到更多真实代码的情况下给出建议有点棘手,但这里有一点是正确的
考虑向C添加一个参数,如下所示:
void C(bool DoExtraWork) {
if (DoExtraWork)...
}
当然,“DoExtrawWork”应该在调用者的上下文中被命名为有意义的东西。我通过简单的状态机解决了类似情况下的一个问题(即,需要知道a是否直接在C之前被调用)。本质上,我使用枚举和属性来管理/查询状态,构建了一个状态对象
当调用我的A()等价物时,它将使业务逻辑块存储脱离状态,表明调用了A。如果调用了其他方法(您的B),它会将状态切换到其他几个状态中的一个(我的情况有点复杂),然后在调用C()时,查询业务逻辑部分,以确定我们是否要调用包含“仅当刚刚调用a”功能的某个方法D()
我怀疑有多种方法可以解决这个问题,但我喜欢我采用的状态机方法,因为它允许我扩展最初的二进制情况,以处理更复杂的多状态情况
幸运的是,在我的例子中,多线程不是一个问题,因为这会使事情变得更有趣,但状态机也可能在这种情况下工作
只要我的两分钱。我不建议这样做,但管它呢:如果你愿意替换所有的简单方法调用:
A();
。。。使用如下语法:
// _lastAction is a class-level Action member
(_lastAction = new Action(A)).Invoke();
void C()
{
if (_lastAction.Method.Name == "A")
{
}
}
。。。然后在C()
中,您可以执行如下检查:
// _lastAction is a class-level Action member
(_lastAction = new Action(A)).Invoke();
void C()
{
if (_lastAction.Method.Name == "A")
{
}
}
这可能不是线程安全的(如果不进行一些修补,它在通过模糊处理程序运行的代码中也不起作用),因此如果不进行大量测试,我不会使用类似的东西。我也不会用这样的句型
注意:我的C#的古老版本只有Action
(而不是Action
或Action
等),因此,如果您也被困在那里,您必须为每个方法添加一个伪参数才能使用这种方法。多个线程会调用一个吗?i、 这需要线程安全吗?是的,我想没有简单的方法可以做到这一点。这些函数可以按任何顺序调用。只是A(),C()的特定顺序需要额外的工作,但是如果我在A()中设置了一个标志,并且在调用B1()或B2()时没有重置它,那么在C()中我会得到错误的行为。+1表示对反射的引用;对于“疯狂”的标签,在这种情况下非常准确;)我见过类似的编码模式,在某些情况下,它们是合理的。毕竟,让一个方法的行为依赖于其类的状态是合理的:PIt证明我能够使用类似的方法来解决它。我使用了一个枚举,找到了一个更干净的解决方案,它不需要耦合函数a()和C()。我同意这种东西非常混乱。当时我只是没有想到一个好的解决方案,但我找到了一个没有混乱的解决方案。谢谢你的努力。