===
оператор, как предполагается, выдерживает сравнение точный равенство содержания, в то время как ==
оператор сравнил бы семантическое равенство. В особенности это принудит строки к числам.
Равенство является обширным предметом. См. статья Wikipedia о равенстве .
If you need to unregister an event, I recommend avoiding anonymous delegates for the event handler.
This is one case where assigning this to a local method is better - you can unsubscribe from the event cleanly.
Give your instance of the anonymous delegate a name:
EventHandler<NewEventArg> handler = delegate(object sender, NewEventArgs e)
{
//some code
};
Subject.NewEvent += handler;
Subject.NewEvent -= handler;
Вы можете создать метод отмены регистрации для всех слушателей события. Это не совсем то, что вам нужно, но иногда это может быть полезно. Например (это действительно работает =)):
class Program {
static void Main(string[] args) {
A someClass = new A();
someClass.SomeEvent += delegate(object sender, EventArgs e) {
throw new NotImplementedException();
};
someClass.ClearEventHandlers();
someClass.FireEvent();
Console.WriteLine("No error.");
}
public class A {
public event EventHandler SomeEvent;
public void ClearEventHandlers() {
Delegate[] delegates = SomeEvent.GetInvocationList();
foreach (Delegate delegate in delegates) {
SomeEvent -= (EventHandler) delegate;
}
}
public void FireEvent() {
if (SomeEvent != null) {
SomeEvent(null, null);
}
}
}
}
Вам нужно отменить регистрацию по какой-либо причине, кроме утечки?
Что касается бита «Или просто разрешите утечку памяти», когда Subject очищается сборщиком мусора, ваш анонимный делегат также должен быть очищен, чтобы не было утечки.
Вам нужно имя для вашей анонимной функции, и тогда вы можете делать это только до тех пор, пока имя находится в scope:
var handler = new EventHandler(delegate(object o, EventArgs e)
{
//do something...
};
Subject.NewEvent += handler;
// later on while handler is still in scope...
Subject.NewEvent -= handler;
Чтобы удалить обработчик при первом вызове:
//SubjectType Subject = ..... already defined if using (2)
EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
// (1)
(sender as SubjectType).NewEvent -= handler;
// or
// (2) Subject.NewEvent -= handler;
// do stuff here
};
Subject.NewEvent += handler;