在C#中有一种方法可以像jQuery“one”方法一样调用一次方法吗?

时间:2011-04-08 16:00:33

标签: c#

我想知道是否有一种方法可以在C#中执行一次代码,比如jquery中的“one”:

$(“#foo”)。one(“click”,function(){   alert(“这只会显示一次。”); });

我想做的是以下内容:

public void foo(){
  Console.Write("hello");
}

然后

foo();
foo();
foo();

,输出结果必须为

hello

我正在寻找一个库而不只是使用flags属性。

7 个答案:

答案 0 :(得分:16)

jQuery示例是一个事件处理程序,一旦调用了事件处理程序,它就会从元素中删除。用于(例如)按钮点击事件的C#中的等价物将是

myButton.Click += new EventHandler(MyEventHandler)

void MyEventHandler(object sender, EventArgs e)
{
  Console.Write("hello");
  ((Button)sender).Click -= new EventHandler(MyEventHandler);
}

这样,只有第一次点击该按钮才会产生控制台写入。

答案 1 :(得分:13)

我无法想象为什么会这样做,但如果你真的这样做,如果你想让它适用于任何方法,你可以这样做:

void Main() {
    var myFoo = callOnlyOnce(foo);
    myFoo();
    myFoo();
    myFoo();

   var myBar = callOnlyOnce(bar);
   myBar();
   myBar();
   myBar();
}

void foo(){
  Console.Write("hello");
}
void bar() { Console.Write("world"); }


Action callOnlyOnce(Action action){
    var context = new ContextCallOnlyOnce();
    Action ret = ()=>{
        if(false == context.AlreadyCalled){
            action();
            context.AlreadyCalled = true;
        }
    };

    return ret;
}
class ContextCallOnlyOnce{
    public bool AlreadyCalled;
} 

答案 2 :(得分:6)

当你可以做这样的事情时,你为什么想要一个图书馆:

private bool wasExecuted = false;

public void foo(){
  if (!wasExecuted) {
     Console.Write("hello");
     wasExecuted = true;
  }
}

答案 3 :(得分:3)

private bool _fooExecuted = false;

public void foo(){
  if (_fooExecuted)
     return;

  _fooExecuted = true;

  Console.Write("hello");
}

答案 4 :(得分:2)

我认为你不会为此找到一个图书馆。这种必要的行为至多是非常罕见的。完成此操作的最简单方法就是拥有一个静态标志变量,如下所示:

static bool hasRun = false;
public void doSomething {
    if (hasRun) {
        return;
    }
}

答案 5 :(得分:1)

你是说在程序的整个执行过程中只有一次,还是你有一个允许再次显示的重置标准?在任何一种情况下,我建议创建一个包装类,您将实例化为一个字段,其中包含您希望“仅一次”显示的每个特定行的嵌入式bool标志。如果已知该字符串是固定的(没有更改它的参数),您还可以使用一个中央服务类来保存一组已经打印的字符串。这个问题是您无法从多个位置记录相同的字符串。

一个常见的通用解决方案是“警报管理器”,尽管我还没有看到标准化的库。然而,它在我的行业中经常出现,因为工业机械可以进入持续警报状态,并且您希望将转换记录到警报状态,但不会持续记录您仍处于警报状态。我使用/看过的解决方案通常会为每种情况创建一个独特的警报代码,具有“设置”和“清除”概念,通常需要操作员干预来确认并最终清除警报。

答案 6 :(得分:1)

我知道这是个老新闻...但这是一个实用的方法,可以解决有人可能会觉得有用的问题:

    public static Action<T> Once<T>(Action<T> action )
    {
        return (arg) =>
        {
            action?.Invoke(arg);
            action = null;
        };
    }

然后,您可以生成一个只完成一次工作的函数:

    var writeNumberToConsole = Once<int>( Console.WriteLine );
    writeNumberToConsole(1); // "1"
    writeNumberToConsole(2); -> //nothing
    writeNumberToConsole(3); -> //nothing