zastanawiałem się czy warto byłoby wdrożenie słabych imprez (gdzie są one właściwe) przy użyciu coś jak poniżej (Gorsza kodĂłw):Czy dobrze jest zaimplementować zdarzenie C# ze słabym odwołaniem pod maską?
class Foo {
private WeakEvent<EventArgs> _explodedEvent = new WeakEvent<EventArgs>();
public event WeakEvent<EventArgs>.EventHandler Exploded {
add { _explodedEvent += value; }
remove { _explodedEvent -= value; }
}
private void OnExploded() {
_explodedEvent.Invoke(this, EventArgs.Empty);
}
public void Explode() {
OnExploded();
}
}
pozwalając innym klasy do subskrybowania i wypisać z wydarzeń tym bardziej konwencjonalny C# składni podczas gdy pod maską faktycznie realizowane ze słabymi odniesieniami:
static void Main(string[] args) {
var foo = new Foo();
foo.Exploded += (sender, e) => Console.WriteLine("Exploded!");
foo.Explode();
foo.Explode();
foo.Explode();
Console.ReadKey();
}
gdzie klasa WeakEvent<TEventArgs>
pomocnik jest zdefiniowany następująco:
public class WeakEvent<TEventArgs> where TEventArgs : EventArgs {
public delegate void EventHandler(object sender, TEventArgs e);
private List<WeakReference> _handlers = new List<WeakReference>();
public void Invoke(object sender, TEventArgs e) {
foreach (var handler in _handlers)
((EventHandler)handler.Target).Invoke(sender, e);
}
public static WeakEvent<TEventArgs> operator + (WeakEvent<TEventArgs> e, EventHandler handler) {
e._handlers.Add(new WeakReference(handler));
return e;
}
public static WeakEvent<TEventArgs> operator - (WeakEvent<TEventArgs> e, EventHandler handler) {
e._handlers.RemoveAll(x => (EventHandler)x.Target == handler);
return e;
}
}
Czy to dobre podejście? czy są jakieś niepożądane efekty uboczne tego podejścia?
Czy wyrejestrowany WeakEventManager? https://msdn.microsoft.com/en-us/library/vstudio/aa970850(v=vs.100).aspx – lintmouse
ruch do http://codereview.stackexchange.com? – quetzalcoatl
@quetzalcoatl no, i do zbliżających się wyborców: nie. To jest dobre dla tej witryny. – AgentFire