Как пользовательские делегаты используются и создаются в C #?

StackOverflow https://stackoverflow.com/questions/618143

  •  03-07-2019
  •  | 
  •  

Вопрос

Я использовал делегатов при разработке выигрышных форм в .NET ... то есть перетащите кнопку, дважды щелкните и заполните событие myButton_click. Я хочу понять, как создавать и использовать определяемые пользователем делегаты в C #.

Как пользовательские делегаты используются и создаются в C #?

Это было полезно?

Решение

Предлагаю прочитать учебник по теме.

По сути, вы объявляете тип делегата:

public delegate void MyDelegate(string message);

Затем вы можете назначить и вызвать его напрямую:

MyDelegate = SomeFunction;
MyDelegate("Hello, bunny");

Или вы создаете событие:

public event MyDelegate MyEvent;

Затем вы можете добавить обработчик событий извне следующим образом:

SomeObject.MyEvent += SomeFunction;

Visual Studio помогает с этим. После того, как вы ввели + =, просто нажмите tab-tab, и он создаст для вас обработчик.

Затем вы можете запустить событие изнутри объекта:

if (MyEvent != null) {
    MyEvent("Hello, bunny");
}

Это основное использование.

Другие советы

public delegate void testDelegate(string s, int i);

private void callDelegate()
{
    testDelegate td = new testDelegate(Test);

    td.Invoke("my text", 1);
}

private void Test(string s, int i)
{
    Console.WriteLine(s);
    Console.WriteLine(i.ToString());
}

Не совсем дубликат (не могу найти дубликат), но здесь много информации о SO, попробуйте

Разница между событиями и делегатами , чтобы получить началось, затем посмотрите на

Когда использовать. , .

Что такое замыкания

Чем занимается этот делегат , , .

Надеюсь, что это поможет

Чтобы получить широкий ответ, ознакомьтесь с этой статьей Мохамад Халаби . Для более короткого ответа проверьте этот слегка измененный пример из папки c: / Program Files / Microsoft Visual Studio 9.0 / Samples / 1033 / ...

using System;
using System.IO; 


namespace DelegateExample
{
  class Program
  {
    public delegate void PrintDelegate ( string s );

    public static void Main ()
    {
      PrintDelegate delFileWriter = new PrintDelegate ( PrintFoFile );
      PrintDelegate delConsoleWriter = new PrintDelegate ( PrintToConsole);
      Console.WriteLine ( "PRINT FIRST TO FILE by passing the print delegate -- DisplayMethod ( delFileWriter )" );

      DisplayMethod ( delFileWriter );      //prints to file
      Console.WriteLine ( "PRINT SECOND TO CONSOLE by passing the print delegate -- DisplayMethod ( delConsoleWriter )" );
      DisplayMethod ( delConsoleWriter ); //prints to the console
      Console.WriteLine ( "Press enter to exit" );
      Console.ReadLine ();

    }

    static void PrintFoFile ( string s )
    {
      StreamWriter objStreamWriter = File.CreateText( AppDomain.CurrentDomain.BaseDirectory.ToString() + "file.txt" );
      objStreamWriter.WriteLine ( s );
      objStreamWriter.Flush ();
      objStreamWriter.Close ();
    }


    public static void DisplayMethod ( PrintDelegate delPrintingMethod )
    { 
      delPrintingMethod( "The stuff to print regardless of where it will go to" ) ;
    }

    static void PrintToConsole ( string s )
    {
      Console.WriteLine ( s );    
    } //eof method 
  } //eof classs 
} //eof namespace 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top