我想知道是否有一种方法可以在C#中执行一次代码,比如jquery中的“one”:
$(“#foo”)。one(“click”,function(){ alert(“这只会显示一次。”); });
我想做的是以下内容:
public void foo(){
Console.Write("hello");
}
然后
foo();
foo();
foo();
,输出结果必须为
hello
我正在寻找一个库而不只是使用flags属性。
答案 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