相关疑难解决方法(0)

如何删除lambda事件处理程序

可能重复:
在C#中取消订阅匿名方法
如何取消注册"匿名"事件处理程序

我最近发现我可以使用lambdas来创建简单的事件处理程序.我可以订阅像这样的点击事件:

button.Click += (s, e) => MessageBox.Show("Woho");
Run Code Online (Sandbox Code Playgroud)

但你怎么取消订阅呢?

c# events lambda event-handling

223
推荐指数
1
解决办法
8万
查看次数

在C#中取消订阅匿名方法

是否可以从事件中取消订阅匿名方法?

如果我订阅这样的事件:

void MyMethod()
{
    Console.WriteLine("I did it!");
}

MyEvent += MyMethod;
Run Code Online (Sandbox Code Playgroud)

我可以这样取消订阅:

MyEvent -= MyMethod;
Run Code Online (Sandbox Code Playgroud)

但是如果我使用匿名方法订阅:

MyEvent += delegate(){Console.WriteLine("I did it!");};
Run Code Online (Sandbox Code Playgroud)

是否有可能取消订阅这种匿名方法?如果是这样,怎么样?

c# delegates anonymous-methods

214
推荐指数
7
解决办法
7万
查看次数

编写内联事件处理程序是不好的做法

编写内联事件处理程序是不好的做法吗?

对我来说,当我想在事件处理程序中使用局部变量时,我更喜欢使用它,如下所示:

我更喜欢这个:

// This is just a sample
private void Foo()
{
    Timer timer = new Timer() { Interval = 1000 };
    int counter = 0; // counter has just this mission
    timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
    timer.Start();
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

int counter = 0; // No need for this out of Boo & the event handler

private void Boo()
{
    Timer timer = new Timer() { Interval = 1000 };

    timer.Tick += timer_Tick;
    timer.Start();
}

void …
Run Code Online (Sandbox Code Playgroud)

c# event-handling inline-code

58
推荐指数
1
解决办法
4万
查看次数

添加和删​​除匿名事件处理程序

我想知道这是否真的有效?

private void RegisterKeyChanged(T item) 
{
    item.OnKeyChanged += (o, k) => ChangeItemKey((T)o, k);
}

private void UnRegisterKeyChanged(T item) 
{
    item.OnKeyChanged -= (o, k) => ChangeItemKey((T)o, k);
}
Run Code Online (Sandbox Code Playgroud)

编译器如何知道事件处理程序是否相同?这甚至是推荐的吗?

c# events anonymous-methods

54
推荐指数
3
解决办法
4万
查看次数

与lambdas一起使用的弱事件处理程序模型

好吧,所以这更像是一个答案而不是一个问题,但在提出这个问题之后,将Dustin Campbell,Egor的各个部分以及" IObservable/Rx/Reactive框架 "中的最后一个提示拉到一起,我想我为这个特殊问题制定了可行的解决方案.它可能会被IObservable/Rx/Reactive框架完全取代,但只有经验才会显示出来.

我故意创造了一个新问题,给我空间来解释我如何得到这个解决方案,因为它可能不会立即显而易见.

有很多相关的问题,大多数人告诉你,如果你想以后能够分离它们,你就不能使用内联lambda:

确实,如果希望以后能够分离它们,您需要保留对lambda的引用.但是,如果您只是希望事件处理程序在订阅者超出范围时自行分离,则此答案适合您.

.net c# events lambda memory-leaks

38
推荐指数
2
解决办法
1万
查看次数

如何断开匿名事件?

可能重复:
如何取消注册"匿名"事件处理程序

我有这样的代码:

        Binding bndTitle = this.DataBindings.Add("Text", obj, "Title");
        bndTitle.Format += (sender, e) =>
        {
            e.Value = "asdf" + e.Value;
        };
Run Code Online (Sandbox Code Playgroud)

我现在如何断开Format事件?

c# events disconnect visual-studio-2008

6
推荐指数
1
解决办法
443
查看次数

有条件的代表?

用户完成表单"f"后,表单将保留一个我要在运行doStuff()之前检查的值.比如,如果f.value> 0,则运行doStuff(),否则,不要运行doStuff().我怎样才能最简洁地修改我的代码以允许进行此项检查?我不太明白何时分配了委托,如果我传递f.value,它会在我添加委托时,还是在运行委托时取值?

form f = new form();
f.Show();
f.FormClosing += delegate{doStuff();};
Run Code Online (Sandbox Code Playgroud)

谢谢!

c# conditional delegates

3
推荐指数
1
解决办法
1755
查看次数

取消在C#中注册简写/内联事件

可能重复:
如何取消注册"匿名"事件处理程序

在我使用的c#方法中

this.Loaded+=(sender,e)=>{ my code }; 
Run Code Online (Sandbox Code Playgroud)

用于在加载时执行代码.但我的问题是我不知道如何取消注册这个链式事件.我尝试过类似的东西

this.Loaded-=(sx,ex)=>{}; 
Run Code Online (Sandbox Code Playgroud)

但事件并非未注册.任何人请帮我解决这个问题.

c#

0
推荐指数
1
解决办法
225
查看次数