c#中是否有一种方法可以像jQuery一样只调用一次方法?方法
本文关键字:方法 一样 一次 jQuery 调用 是否 一种 | 更新日期: 2023-09-27 17:49:35
我想知道是否有一种方法可以在c#中只执行一次代码,就像jquery中的"one":
$ (" # foo ")。一个("点击",函数(){alert("这将只显示一次");});
我想做的是:
public void foo(){
Console.Write("hello");
}
然后foo();
foo();
foo();
,输出结果必须为
hello
我正在寻找一个库,而不仅仅是使用标志属性。
我无法想象为什么要这样做,但如果你真的要这样做,如果你想让它适用于任何方法,你可以这样做:
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"的概念,通常需要操作员干预才能确认并最终清除警报。