EventHandler<EventArgs> temp = Bang;if (temp != null) temp(this, EventArgs.Empty);
EventHandler<EventArgs> temp = Bang;if (temp != null){ var list = ev.GetInvocationList(); foreach (EventHandler<EventArgs> d in list) { try { d.Invoke(this, EventArgs.Empty); } catch (Exception) { } }}
Wyjatki
Wyjątki maja następujące własności:• wyjątki to typy, które dziedziczą z klasy
System.Exception,• wyjątki, które mogą być zgłaszane należy objąć sekcja
try,• wyjątki są zgłaszane przez stosowanie słowa kluczowego
throw,• w momencie zgłoszenia wyjątku, kontrola sterownia jest
przekazywana do pierwszej• obsługi wyjątku określonej słowem catch,
• jeśli nie ma obsługi zgłoszonego wyjątku, program zostaje zatrzymany i wyświetlany jest komunikat o błędzie,
• nie należy przechwytywać wyjątku, który nie jest możliwy do obsłużenia i wprowadzenia, poprzez to aplikacja przechodzi w stan nieokreślony.
• W przypadku przechwycenia System.Exception najlepiej zgłosić ten wyjątek ponownie na końcu bloku catch,
• warto w bloku wyjątku podawać nie tylko typ wyjątku ale ta reprezentująca wyjątek może dostarczyć dodatkowych informacji o powodach wystąpienia sytuacji krytycznej,
• obiekty wyjątku zawierają szczegółowe informacje o błędzie, min. stan stosu wywołań oraz tekstowy opis błędu,
• kod w sekcji finally jest wykonywany nawet w przypadku zgłoszenia wyjątku, blok finally warto stosować do zwalniana użytych zasobów, np.: zamykania otwartych strumieni i plików,
• wyjątki zarządzane w platformie .NET są implementowane z użyciem struktury wyjątków Win32/Win64, jednak nie można ich traktować jako wyjątków systemowych.
class Pokaz { public static void Main() { int[] tablica = new int[10]; try { for (int i = 0; ; i++) { tablica[i] = i; Console.WriteLine(i); }} catch(IndexOutOfRangeException) { Console.WriteLine(„Nastąpiło właśnie przepełnienie indeksu”); }}}
Najczęstsze przyczyny rzucanych wyjątków
• ArraryTypeMismatchException – Typ wartości jaki chcemy przypisać jest niezgodny z typem docelowym
• DivideByZeroException – Próba dzielenia przez zero
• IndexOutOfRangeException – Przekroczenie indeksu
• InvalidCastException – Niepoprawne rzutowanie w czasie rzeczywistym
• OutOfMemoryException – Porażka wywołania new z powodu braku wolnej pamięci
• OverflowException – Arytmetyczne przepełnienie
Delegacje
• Bardzo często spotkamy się w naszych programach z sytuacją, w której nasz program wykonuje jakieś działanie, ale nie wie jakich obiektów a nawet metod ma w tym celu użyć. Na przykład: naciśnięcie przycisku ma poinformować inny obiekt, że przycisk został przyciśnięty. Ale jaki to obiekt? Nie wiadomo, dlatego najlepszym rozwiązaniem jest połączenie tego przycisku z delegatem, który następnie w czasie wykonywania się programu wywoła odpowiednią metodę.
• Możemy powiedzieć więcej, delegacje i zdarzenia są ściśle powiązane ze sobą, ponieważ delegat potrafi obsługiwać zdarzenie.
Konstrukcja delegacji
public delegate typ name(params);
Typ - typ zwracanej przez delegaturę wartości np. in, string lub void;
Name - nazwa delegacji wykorzystywana potem do jej wywołania;
Params – parametry delegatury, muszą być zgodne z parametrami funkcji której delegacja dotyczy;
Delegacje – przykład użycia
public class Delegaty{ public delegate int MojDelegat(int a, int b); public int Dodaj(int a, int b) { return a + b; }
public int Odejmij(int a, int b) { return a - b; } public int Pomnoz(int a, int b) { return a * b; } public int Podziel(int a, int b) { return a / b; }}
class Glowna{ static void Main() { Delegaty d = new Delegaty();
Delegaty.MojDelegat dodawanie = new Delegaty.MojDelegat(d.Dodaj);
int wynikDodawania = dodawanie(4, 6); System.Console.WriteLine("Wynik dodawania
wynosi: {0}.", wynikDodawania.ToString());
Delegaty.MojDelegat odejmowanie = new Delegaty.MojDelegat(d.Odejmij);
int wynikOdejmowania = odejmowanie(22, 11);
System.Console.WriteLine("Wynik odejmowania wynosi: {0}.",
wynikOdejmowania.ToString());………………………………………………………………………//analogicznie dla mnożenia i dzielenia}
Delegacje zdarzeń
public delegate void EventHandler(object sender, EventArgs e);
public class Przycisk { public event EventHandler Klikniecie;
}
Wątki w Windows Mobile
using System.Threading;………………………….private void proc(){…………….}………………Thread name = new Thread(proc);……………………..
Klasa Thread - właściwości
• IsAlive• IsBackground• IsThreadPoolThread• ManagedThreadId• Name• Piority• ThreadState
Klasa Thread - metody statyczne
• BeginCriticalRegion()• EndCriticalRegion()• GetDomain()• GetDomainID()• ResetAbort()• Sleep()• SpinWait()• VolatileRead()• VolatileWrite()
Klasa Thread - Typ wyliczeniowy ThreadState
• Aborted• AbortRequested• Background• Running• Stopped• StopRequested• Unstarted• WaitSleepJoin