2012-03-11 14 views
5

Plakaty o numerach Are EventArg classes needed now that we have generics i Does .NET have a built-in EventArgs<T>? radzą sobie z ogólną sytuacją EventArgs, przynajmniej takie jest moje odczucie.Generic EventArgs dla wbudowanych typów

Czy używanie go jest uzasadnione, gdy wszystko, czego potrzebuję, jest jednym z typów wbudowanych? W moim konkretnym przypadku czytam ze strumienia przez TCP, a kiedy dane są odbierane, subskrybenci są powiadamiani.

public event EventHandler<EventArgs<string>> data_received = delegate { }; 

... 

while (!reader.EndOfStream) 
{ 
    if ((data = reader.ReadLine()) != "") 
    { 
     this.data_received(this, new EventArgs<string>(data)); 
    } 
} 

A może wydarzenie nie jest najlepszym sposobem przekazania danych subskrybentom?

Odpowiedz

5

Krótka odpowiedź: to zależy.

Można wziąć pod uwagę klasę EventArgs<T>, taką jak Tuple<T>, która służy do przekazywania i odbierania danych do/z metody. W niektórych prostych przypadkach i dla wewnętrznego użycia jest właściwe, ale w bardziej złożonych przypadkach lub na powierzchni publicznej bardziej odpowiednie byłoby użycie osobnego typu.

W przypadku EventArgs<T> mamy mniej więcej taki sam dylemat. Do użytku wewnętrznego jego OK, aby używać tego typu, ale dla publicznego API może prowadzić do koszmaru konserwacji.

Na pierwszy rzut oka wydaje się, że na pierwszy rzut oka można użyć numeru EventArgs<T>, ale jeśli później zdecydujesz się dodać do tego dodatkowe informacje, takie jak EndPoint? W takim przypadku możesz użyć EventArgs<T, U> (np. Tuple<T, U>) lub możesz przełączyć na niestandardową klasę EventArgs. W obu przypadkach złamiesz wszystkich swoich klientów, a jeśli jesteś tylko jednym klientem tego kodu - to jest ok, ale jeśli nie ...

Dolna linia, dla wewnętrznych rzeczy można używać EventArgs, ale dla publicznej powierzchni I sugeruje użycie niestandardowych argumentów zdarzeń.

P.S. Ogólna konwencja nazewnictwa dla zdarzeń to CamelCase, aw twoim konkretnym przypadku oznacza to, że bardziej odpowiednia nazwa dla twojego wydarzenia to DataReceived.

Powiązane problemy