ホームページ  >  記事  >  バックエンド開発  >  C# での委任、イベント、非同期の使用法についての簡単な紹介

C# での委任、イベント、非同期の使用法についての簡単な紹介

黄舟
黄舟オリジナル
2017-03-24 11:17:401824ブラウズ

この記事では主に C# における委任、イベント、非同期に関する関連知識を紹介します。非常に良い基準値を持っています。以下のエディターで見てみましょう

私が初めて C# プログラミングに触れてから約 1 年が経ちました。学習の過程では常に逆説的なことが多く、私もつい最近まで理解できませんでした。

この記事では、まず使用方法を紹介し、次に機能を評価します。

1. デリゲート

基本的な使用法:

1. デリゲートの型を宣言します。デリゲートは「クラス」のようなものです。デリゲートを宣言した後、この特性を持つ複数のデリゲートを作成できます。 (機能とは戻り値とパラメーターの型を指します)

public delegate void SomeKindOfDelegate(<a href="http://www.php.cn/wiki/57.html" target="_blank">string) <code>public delegate void SomeKindOfDelegate(<a href="http://www.php.cn/wiki/57.html" target="_blank">string</a> result);

2.创建一个在1中创建的委托类型的委托。

public SomeKindOfDelegate aDelegate;

3.为2中创建的具体的委托添加响应函数。响应函数必须符合1中的‘特征'。

aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate);
private void aFunctionThatJustForDelegate(string result)
{
MessageBox.Show(result);
}

4.完成以上三步之后,就可以使用Invoke来对委托进行调用了。Invoke可以选择调用的目标函数,调用优先级,以及调用的参数。

aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null);

上面是基本用法,除了这种基本用法之外,还可以结合var、匿名委托、lambda委托等方法。

完整代码:

namespace wtfIsDelegate
{
 public delegate void SomeKindOfDelegate(string result);
 public partial class Form1 : Form
 {
  public event SomeKindOfDelegate aDelegate;
  public Form1()
  {
   InitializeComponent();
   aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate);
   aDelegate.BeginInvoke("Hello~I&#39;m being invoked!", null, null);
  }
  private void btnDelegate_Click(object sender, EventArgs e)
  {
  }
  private void aFunctionThatJustForDelegate(string result)
  {
   MessageBox.Show(result);
  }
 }
}

委托的用处:

委托的优点,是可以实现异步(BeginInvoke),还可以在某种需要同时调用多个同参数、返回值的情况下简化代码。

二、事件

基本用法:

1.定义委托。

public delegate void SomeKindOfDelegate(string result);

2.定义事件。

public event SomeKindOfDelegate aDelegate;

3.为事件添加响应函数。

process.Exited += new EventHandler(CmdProcess_Exited); result);

2. 1.で作成したデリゲートタイプのデリゲートを作成します。

public SomeKindOfDelegate aDelegate;3. 2 関数

。応答関数は 1 の「特性」に適合する必要があります。

process.Exited += new EventHandler(CmdProcess_Exited); // 注册进程结束事件 。
4. 上記の 3 つの手順を完了したら、Invoke を使用してデリゲートを呼び出すことができます。 Invoke では、呼び出すターゲット関数、呼び出しの優先順位 および呼び出しのパラメータを選択できます。

aDelegate.BeginInvoke("こんにちは〜呼び出されています!", null, null);


上記は基本的な使い方です。この基本的な使い方に加えて、var を組み合わせることができます。匿名委任、ラムダ委任、その他のメソッド。

完全なコード:

public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

委任の使用:

委任の利点は、非同期 (BeginInvoke) を実装できることです。また、複数の同じパラメータと戻り値が必要な特定の状況ではコードを簡素化することもできます。同時に呼び出されます。

2. イベント

基本的な使用法:

1. 委任を定義します。

public delegate void SomeKindOfDelegate(string result);

2. イベントを定義します。

public event SomeKindOfDelegate aDelegate;

3. イベントに応答関数を追加します。

process.Exited += new EventHandler(CmdProcess_Exited);

4. イベントのトリガー (呼び出し) メソッドを指定します。 ([トリガーせずに直接呼び出すこともできます])

説明:

C# では、各種類の「イベント」はおそらくその「🎜イベント ハンドラー🎜EventHandler」に対応します。たとえば、Process クラスの OutputDataReceived イベントは DataReceivedEventHandler に対応します。PasswordChanged などの非特定の「イベント」の場合、それらはすべて RoutedEventHandler や EventHandler などのより一般的な「イベント ハンドラー」に対応します。ただし、「EventHandler」は仲介として機能するだけです。「Event」が実際にトリガーされた後に何をするかは、次のように手動で指定する必要があります: 🎜rrreee🎜EventHandler もデリゲートです。例えば、🎜🎜rrreee🎜🎜カスタムイベント🎜🎜🎜🎜カスタムイベントは、ある意味でプログラムの流れを変える手法であり、ある条件の変化は「継続的なクエリ」によって決定されます。 ' '「サブスクリプションと処理」の関係に変換されました。 🎜🎜カスタム イベントには次の要素が必要です: 🎜🎜イベントの開始者、イベントのサブスクリプション、およびイベントのハンドラー。パラメーターはイニシエーターからハンドラーに渡すことができます。 🎜🎜イベントの「開始」は、「🎜OnKeyDown🎜」、「OnMouseClick」([このように書かれたソースコードを見たことがありません])などの特定のシステムメッセージ、または特定の条件が満たされた場合(たとえば、同じ文字を 2 回入力すると、その文字が自動的に呼び出されます (実際には、システム メッセージを受信することを「条件達成」とみなすこともできます)。 [他のイベントはこのように書かれています]🎜🎜一部のイベントには明確な「開始者」がありません。 🎜🎜🎜委任とイベントの関係は何ですか? 🎜🎜🎜委任とカスタム イベントの使用法は非常に似ています。イベントはクラス内でのみ呼び出すことができます。デリゲートの場合はどこでも呼び出すことができます。呼び出し方法が少し違うようです(パラメータの受け渡し方法)🎜🎜呼び出し方法とパラメータの受け渡しの違いにより、イベントはより保守的/安定しているようです。また、出来事は「理解」しやすくなり、受け入れやすくなります。 🎜🎜Delegate は非同期 (呼び出し開始) によく使用されるようです。 Event はカスタム イベントによく使用されます。 🎜🎜🎜委任と非同期の関係は何ですか? 🎜🎜🎜非同期は委任が実現できる機能です (または「現象」と呼ぶこともできます)。非同期はマルチスレッド (スレッド、スレッドプール、タスクなど))。 🎜

以上がC# での委任、イベント、非同期の使用法についての簡単な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。