c#中是否有一种方法可以像jQuery一样只调用一次方法?方法

本文关键字:方法 一样 一次 jQuery 调用 是否 一种 | 更新日期: 2023-09-27 17:49:35

我想知道是否有一种方法可以在c#中只执行一次代码,就像jquery中的"one":

$ (" # foo ")。一个("点击",函数(){alert("这将只显示一次");});

我想做的是:

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

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

,输出结果必须为

hello

我正在寻找一个库,而不仅仅是使用标志属性。

c#中是否有一种方法可以像jQuery一样只调用一次方法?方法

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

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;
} 

jQuery示例是一个事件处理程序,一旦事件处理程序被调用,它将从元素中删除。c#中(例如)按钮点击事件的等效值是

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

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

我知道这是旧闻了…但这里有一个函数式的方法来解决这个问题,有人可能会觉得有用:

    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

当你可以做这样的事情时,为什么你需要一个库呢?

private bool wasExecuted = false;
public void foo(){
  if (!wasExecuted) {
     Console.Write("hello");
     wasExecuted = true;
  }
}
private bool _fooExecuted = false;
public void foo(){
  if (_fooExecuted)
     return;
  _fooExecuted = true;
  Console.Write("hello");
}

我不认为你会找到一个图书馆。这种必需的行为是非常罕见的。最简单的方法就是设置一个静态标志变量,如下所示:

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

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

一个常见的通用解决方案是"警报管理器",尽管我还没有看到一个标准化的库。然而,它在我的行业中经常出现,因为工业机械可能会进入一个持续的警报状态,你想要记录进入警报状态的转变,而不是持续地记录你仍然处于警报状态。我所使用/看到的解决方案通常为每种情况创建一个独特的警报代码,带有"set"answers"clear"的概念,通常需要操作员干预才能确认并最终清除警报。