Latest web development tutorials

C # delegat (delegat)

C # Principal (Delegat) podobna do C lub C ++ wskaźnika funkcji.Principal (Delegat) istnieje metoda dla typu odniesienia odniesienia zmiennych.Referencje mogą być zmieniane w czasie wykonywania.

Principal (Delegat) specjalnie przeznaczone do zdarzeń i metod zwrotnych. Wszystko delegat (delegat) wywodzą się z klasySystem.Delegate.

Oświadczenie Komisji (Delegat)

Oświadczenie Proxy określa sposób może być określany przez delegata. Pełnomocnik może wskazywać na sposób o tej samej etykiety.

Na przykład, załóżmy, że masz delegata:

Delegat public int MyDelegate (string s);

Powyższa komisja może być stosowany w odniesieniu do każdej metody, która przyjmuje jeden parametrciągi zwraca zmienną typuint.

Składnia deklarujących zlecone w następujący sposób:

Delegat <typ zwrotny> <delegat-name> <parameter list>

Przykłady komisji (Delegat)

Gdy ogłoszono typ delegata, obiekt delegat musi użyćnowego słowa kluczowego, aby utworzyć, a także z określonymi metodami.Po utworzeniu parametru delegata przekazany donowego wyciągu jako wywołanie metody, jak pisanie, ale nie ma argumentów.Na przykład:

Delegat public void printString (string s);
...
printString PS1 = new printString (WriteToScreen);
printString PS2 = new printString (WriteToFile);

Poniższy przykład ilustruje stwierdzenie Komisji, instancje i używać, delegat może być użyty do Referencyjna metoda z argumentem liczby całkowitej i zwraca wartość całkowitą.

using System;

delegować int NumberChanger (int n);
DelegateAppl przestrzeni nazw
{
   Klasa TestDelegate
   {
      static int num = 10;
      public static int AddNum (int p)
      {
         num + = p;
         powrót num;
      }

      public static int MultNum (int q)
      {
         num = q *;
         powrót num;
      }
      public static int getNum ()
      {
         powrót num;
      }

      static void Main (string [] args)
      {
         // Tworzenie instancji delegata NumberChanger NC1 = new NumberChanger (AddNum);
         NumberChanger NC2 = new NumberChanger (MultNum);
         // Wywołanie metody przy użyciu NC1 obiektu delegata (25);
         Console.WriteLine ( "Wartość Num: {0}", getNum ());
         NC2 (5);
         Console.WriteLine ( "Wartość Num: {0}", getNum ());
         Console.ReadKey ();
      }
   }
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Wartość Num: 35
Wartość Num: 175

Na zlecenie multicast (multiemisji delegata)

Obiekt Delegat może użyć operatora "+", aby scalić. Delegat nazwać to scalić scalić dwóch delegatów. Tylko ten sam typ ufności mogą być łączone. "-" Operator może być stosowany w celu usunięcia składnika z połączonej delegata delegata.

Użyj tego przydatna funkcja zlecenie, można utworzyć listę delegata wywołuje metodę, gdy nazywa się powołać. To się nazywa przekazanemultiemisji (rozsyłanie), znany również jako adres grupowy.Poniższy program demonstruje multicast delegata:

using System;

delegować int NumberChanger (int n);
DelegateAppl przestrzeni nazw
{
   Klasa TestDelegate
   {
      static int num = 10;
      public static int AddNum (int p)
      {
         num + = p;
         powrót num;
      }

      public static int MultNum (int q)
      {
         num = q *;
         powrót num;
      }
      public static int getNum ()
      {
         powrót num;
      }

      static void Main (string [] args)
      {
         // Utworzenie instancji delegata NumberChanger NC;
         NumberChanger NC1 = new NumberChanger (AddNum);
         NumberChanger NC2 = new NumberChanger (MultNum);
         nc = NC1;
         nc + = NC2;
         // Wywołanie multicast NC (5);
         Console.WriteLine ( "Wartość Num: {0}", getNum ());
         Console.ReadKey ();
      }
   }
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Wartość Num: 75

Główne zastosowania (Delegowanie)

Poniższy przykład ilustruje użycie delegacji. GłównyprintStringbyć wykorzystane do Referencyjna metoda z ciągiem na wejściu i niczego nie powrócić.

Używamy tego delegata zadzwonić dwa sposoby, pierwszy ciąg wydrukowany do konsoli, a drugi ciąg do drukowania do pliku:

using System;
using System.IO;

DelegateAppl przestrzeni nazw
{
   Klasa PrintString
   {
      statyczne fs FileStream;
      statyczne sw StreamWriter;
      // Deklaracja Proxy delegata public void printString (string s);

      // Metoda ta drukuje na konsolę public static void WriteToScreen (string str)
      {
         Console.WriteLine ( "The String jest: {0}", str);
      }
      // Metoda ta drukuje do pliku public static void WriteToFile (string s)
      {
         fs = new FileStream ( "c: \\ message.txt"
         FileMode.Append, FileAccess.Write);
         sw = new StreamWriter (FS);
         sw.WriteLine (s);
         sw.Flush ();
         sw.Close ();
         fs.Close ();
      }
      // Ta metoda delegata jako parametr, oraz wykorzystanie go do wywołania metody public static void sendString (printString ps)
      {
         ps ( "Hello World");
      }
      static void Main (string [] args)
      {
         printString PS1 = new printString (WriteToScreen);
         printString PS2 = new printString (WriteToFile);
         sendString (PS1);
         sendString (PS2);
         Console.ReadKey ();
      }
   }
}

Gdy powyższy kod jest kompilowany i wykonany, że daje następujące wyniki:

Ciąg jest: Hello World