Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
1時間9分13秒
C#のイベントは、多くの開発者が使用する基本的な概念ですが、特に独自のイベントを作成する場合、完全に理解していない可能性があります。 ティム・コーリーは、"C# Events - Creating and Consuming Events in Your Application"というビデオで、ベストプラクティスと高度な機能を探求しながら、イベントの作成と使用方法について包括的なガイドを提供しています。
この記事では、ティム・コーリーのビデオ例を用いて、C#イベントの構文、定義方法、一般的なプログラミングの問題を解決する方法について説明します。 C#のイベント処理を理解することは、応答性の高いアプリケーションを構築するために不可欠であり、この記事は、カスタムエラーログ、例外処理、イベント駆動型プログラミングの中核となる概念を把握するのに役立ちます。
C#やプログラミング言語では、イベントはイベント駆動型プログラミングにおいて重要な役割を果たし、アプリケーションはユーザーとの対話やシステムの変更などのアクションに応答できるようになります。 他のプログラミング言語と比較して、C#はイベントの処理に構造化されたアプローチを提供し、高速なアプリケーションにも小規模なアプリケーションにも理想的です。 C#のイベントは特定のアクションによってトリガーされ、これらのアクションは対応するイベントハンドラを呼び出して目的のタスクを実行します。
Timはまず、ほとんどの開発者はC#のイベントに精通しているが、カスタムイベントの作成方法を知らないかもしれないと説明する。 ビデオのゴールは、イベントを紹介し、カスタムイベントの作成方法を説明し、その機能について説明し、ベストプラクティスの概要を説明することです。
Timは、Windowsフォーム(WinForms)で構築されたシンプルな銀行アプリケーションを使用して、イベントのデモンストレーションを行います。 このアプリケーションは、残高の表示や取引の記録など、ある顧客の基本的な銀行業務をシミュレートするものです。
1.アプリケーションの概要:
2.メインフォーム:
3.トランザクションフォーム:
Timは、デモ・バンキング・アプリケーションのバックエンド・コードを説明しています:
1.顧客クラス:
2.アカウントクラス:
3.預金と支払いの処理:
4.オーバードラフト保護:
コードサンプルについては、ティム・コーリーが3:18から18:27までコードを説明しているビデオを直接参照することができます。
このセクションでは、Tim Corey が Windows Forms のボタンのクリックイベントの仕組みに入り込み、これらのイベントがどのように配線され、どのように機能するかを説明します。
Timはまず、Windows Formsアプリケーションにおけるボタンのクリックイベントというおなじみの概念から説明します。 デザイナーでボタンをダブルクリックすると、Visual Studioは自動的にクリック・イベントのイベント・ハンドラ・メソッドを生成します。
1.イベントハンドラ・メソッド:
private void recordTransactionButton_Click(object sender, EventArgs e)
{
// Code to handle the button click event
}
2.Wiring Up the Event:
this.recordTransactionButton.Click += new System.EventHandler(this.recordTransactionButton_Click);AddHandler Me.recordTransactionButton.Click, AddressOf Me.recordTransactionButton_ClickTimは、イベントがトリガーされるAccountクラスから始めて、C#でカスタムイベントを作成する方法を説明します。
1.イベントの定義:
public event EventHandler<string> RaiseTransactionApprovedEvent;Public Event RaiseTransactionApprovedEvent As EventHandler(Of String)2.イベントのトリガー:
this)とイベントデータ(この場合は文字列)。private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}
3.イベントの配線と処理:
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Code to handle the event
}
Timは、トランザクションが承認されたときなど、特定のアクションが発生したときにブラウザのUIを自動的に更新するためにイベントを使用する方法を説明します。
1.イベント開催:
public void AddDeposit(decimal amount, string depositName)
{
// Code to add deposit
RaiseTransactionApprovedEvent?.Invoke(this, depositName);
}
2.UIでイベントを購読する:
public MainForm()
{
InitializeComponent();
account.RaiseTransactionApprovedEvent += Account_RaiseTransactionApprovedEvent;
}
private void Account_RaiseTransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new transaction
}
Tim Coreyは、C#でイベントを発生させる際の?.Invoke()構文の使用について説明しています。 この現代的なアプローチは、コードを簡素化し、スレッドの安全性を保証します。
Invokeの前のクエスチョンマーク(? イベントハンドラを呼び出す前に、NULLかどうかをチェックし、例外が発生する可能性を防ぎます。
1.従来のアプローチ:
if (RaiseTransactionApprovedEvent != null)
{
RaiseTransactionApprovedEvent(this, depositName);
}
2.最新のアプローチ ?.Invoke():
RaiseTransactionApprovedEvent?.Invoke(this, depositName);RaiseTransactionApprovedEvent?.Invoke(Me, depositName)RaiseTransactionApprovedEvent がnullの場合、呼び出しは進まず、例外を回避できます。3.メリット:
Tim は Windows Forms アプリケーションでカスタムイベントをリッスンし、それに応じて UI を更新する方法を説明します。
1.イベントを購読する:
customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;AddHandler customer.CheckingAccount.TransactionApprovedEvent, AddressOf CheckingAccount_TransactionApprovedEvent2.イベントハンドラ・メソッド:
private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new transaction
checkingTransactionsDataSource.DataSource = null;
checkingTransactionsDataSource.DataSource = customer.CheckingAccount.Transactions;
checkingBalanceLabel.Text = customer.CheckingAccount.Balance.ToString("C2");
}
Timは、カスタム・イベントの作成、発生、処理の全プロセスを実際に実演します。
1.イベントのトリガー:
private void OnTransactionApproved(string transactionName)
{
RaiseTransactionApprovedEvent?.Invoke(this, transactionName);
}
2.複数のイベントを処理する:
public MainForm()
{
InitializeComponent();
customer.CheckingAccount.TransactionApprovedEvent += CheckingAccount_TransactionApprovedEvent;
customer.SavingsAccount.TransactionApprovedEvent += SavingsAccount_TransactionApprovedEvent;
}
private void SavingsAccount_TransactionApprovedEvent(object sender, string e)
{
// Update the UI with the new savings transaction
savingsTransactionsDataSource.DataSource = null;
savingsTransactionsDataSource.DataSource = customer.SavingsAccount.Transactions;
savingsBalanceLabel.Text = customer.SavingsAccount.Balance.ToString("C2");
}
3.アプリケーションの実行:
Timは、イベントをデバッグし、イベントとともに送信される情報を検査する方法を示します。
1.ブレークポイントの設定:
private void CheckingAccount_TransactionApprovedEvent(object sender, string e)
{
// Breakpoint here
}
2.デバッグ:
ティム・コリーは、当座貸越の状況を処理するための別のカスタム・イベントを作成することで、デモを拡張します。 このイベントは、当座貸越が発生したときにトリガーされ、ユーザーに当座貸越額を通知します。
Tim は、当座借越のシナリオのために Account クラスで新しいイベントを定義することから始めます:
1.イベント宣言:
public event EventHandler<decimal> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of Decimal)2.イベントのトリガー:
if (overdraftSuccessful)
{
OverdraftEvent?.Invoke(this, overdraftAmount);
}
1.Wiring Up the Event:
customer.CheckingAccount.OverdraftEvent += CheckingAccount_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEvent2.イベントの処理:
private void CheckingAccount_OverdraftEvent(object sender, decimal e)
{
errorMessage.Text = $"You had an overdraft protection transfer of {e:C2}";
errorMessage.Visible = true;
}
3.イベントのトリガーと表示:
You had an overdraft protection transfer of $20.44
Timは、同じイベントを複数の言語とフォームで聴く方法を説明し、イベントの多用途性を示しています。
1.別のフォームにラベルを追加する:
<asp:Label ID="errorMessage" runat="server" Visible="false" />
2.イベントに参加する:
customer.CheckingAccount.OverdraftEvent += SecondaryForm_OverdraftEvent;AddHandler customer.CheckingAccount.OverdraftEvent, AddressOf SecondaryForm_OverdraftEvent3.イベントの処理:
private void SecondaryForm_OverdraftEvent(object sender, decimal e)
{
errorMessage.Visible = true;
}
4.同時イベント処理:
Both the main form and the secondary form display the overdraft message when the event is triggered.
Timは、メモリリークを防ぎ、適切なアプリケーションパフォーマンスを確保するために、イベントリスナーをクリーンアップすることの重要性を強調しています。
1.イベントの配信停止:
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEvent重要な理由:
2.名前付きメソッドの使用:
// Good practice: using named methods for event handlers' Good practice: using named methods for event handlersティム・コリーは、イベントを通してデータを渡すためのベストプラクティス、特に文字列や10進数のような単純なデータ型ではなくクラスを使用することの利点について説明しています。
Timはまず、イベントに単純なデータ型を使用することがあまり一般的でない理由と、一般的にクラスを渡す方が良い理由について説明します:
1.柔軟性と拡張性:
2.EventArgsの継承:
Timは、オーバードラフトイベント用のカスタムEventArgsクラスを作成する方法を示します。
1.クラスを定義する:
public class OverdraftEventArgs : EventArgs
{
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
public OverdraftEventArgs(decimal amountOverdrafted, string moreInfo)
{
AmountOverdrafted = amountOverdrafted;
MoreInfo = moreInfo;
}
}
2.イベントでクラスを使用する:
public event EventHandler<OverdraftEventArgs> OverdraftEvent;Public Event OverdraftEvent As EventHandler(Of OverdraftEventArgs)3.イベントのトリガー:
OverdraftEvent?.Invoke(this, new OverdraftEventArgs(amountNeeded, "Additional info"));OverdraftEvent?.Invoke(Me, New OverdraftEventArgs(amountNeeded, "Additional info"))Timは、イベントデータの偶発的な変更を防ぐために、EventArgsクラスで読み取り専用のプロパティを使用することの重要性を強調しています。
1.修正を避ける:
2.問題の例:
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
e.AmountOverdrafted = 1000; // This modification affects all handlers
}
3.ソリューション:
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
ティム・コリーは、イベントデータ・プロパティにプライベート・セッターを使用するというルールの重要な例外を強調しています。 この例外は、特定の条件に基づいてトランザクションがキャンセルされる場合など、イベントリスナーがイベントデータを変更できるようにする必要がある場合です。
Timは、イベントハンドラがトランザクションをキャンセルする必要がある場合の例を示します。 これは、カスタムEventArgsクラスにCancelTransactionプロパティを追加することで実現されます。
1.プロパティの定義:
public class OverdraftEventArgs : EventArgs
{
public decimal AmountOverdrafted { get; private set; }
public string MoreInfo { get; private set; }
public bool CancelTransaction { get; set; } = false;
public OverdraftEventArgs(decimal amountOverdrafted, string moreInfo)
{
AmountOverdrafted = amountOverdrafted;
MoreInfo = moreInfo;
}
}
2.イベントハンドラでプロパティを設定する:
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
if (denyOverdraft.Checked)
{
e.CancelTransaction = true;
}
errorMessage.Text = $"You had an overdraft protection transfer of {e.AmountOverdrafted:C2}";
errorMessage.Visible = true;
}
3.ソースメソッドのプロパティをチェックする:
if (args.CancelTransaction)
{
return false; // Transaction is canceled
}
ティムは、よりインタラクティブでユーザーフレンドリーなアプリケーションにさらに磨きをかけます。
1.当座貸越管理のチェックボックスを追加する:
private void InitializeComponent()
{
this.denyOverdraft = new System.Windows.Forms.CheckBox();
// Initialize other controls
this.denyOverdraft.Text = "Stop Overdrafts";
this.denyOverdraft.CheckedChanged += new System.EventHandler(this.denyOverdraft_CheckedChanged);
}
2.チェックボックスの状態を扱う:
private void denyOverdraft_CheckedChanged(object sender, EventArgs e)
{
if (denyOverdraft.Checked)
{
// Logic to stop overdraft transactions
}
}
3.イベントハンドラの更新:
private void CheckingAccount_OverdraftEvent(object sender, OverdraftEventArgs e)
{
if (denyOverdraft.Checked)
{
e.CancelTransaction = true;
}
errorMessage.Text = $"You had an overdraft protection transfer of {e.AmountOverdrafted:C2}";
errorMessage.Visible = true;
}
Tim Corey は、C# でイベントを扱う際の重要なポイントとベストプラクティスをまとめ、チュートリアルを締めくくります。
1.イベントリスナーを削除する:
customer.CheckingAccount.OverdraftEvent -= CheckingAccount_OverdraftEvent;RemoveHandler customer.CheckingAccount.OverdraftEvent, AddressOf CheckingAccount_OverdraftEvent2.使用 EventArgs 継承:
3.読み取り専用プロパティのプライベート・セッター:
4.イベントハンドラ構文:
5.無条件演算子:
Tim Corey の C# events に関する包括的なチュートリアルでは、イベントを効果的に作成、処理、および管理するための貴重な洞察と実践的な例を提供しています。 これらのベストプラクティスに従うことで、開発者はよりインタラクティブで応答性の高いアプリケーションを作成することができます。
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy