Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中调用任何其他方法时,如何自动重置布尔值?_C#_Set_Call_Flags - Fatal编程技术网

在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()。我同意这种东西非常混乱。当时我只是没有想到一个好的解决方案,但我找到了一个没有混乱的解决方案。谢谢你的努力。