Tips - Visual C#

【TOP】

デリゲートでイベント生成
ネコクラス(Cat.cs)を作成し、名前を付けられた時にNamedイベントが発生する仕組みをデリゲートを使って行ってみます。
NamedEventArgs は EventArgs から派生しており、Named イベントの引数となります。
NamedEventArgs の作成は必須ではありませんが、練習のため(^^;
処理の本体は Program.cs です。NamedEventArgs で条件分岐していますが、sender オブジェクトを使うほうが自然かも。
// Cat.cs using System; using System.Drawing; namespace ConsoleApplication1 { public class Cat { // ネコの名前 protected string _name; // ネコの色 protected Color _color; // イベントデリゲート public delegate void NamedEventHandler(object sender, NamedEventArgs e); // 名前の変更イベント public event NamedEventHandler Named; // 名前の変更イベントの引数 protected NamedEventArgs _eventArgs; // コンストラクタ public Cat(string name, Color color) { _name = name; _color = color; } // 名前プロパティ public string Name { get { return _name; } set { _name = value; OnNamed(); // ☆★イベントを発生させる★☆ } } // 鳴く public void Mew() { Console.WriteLine("にゃぁ"); Console.WriteLine(""); return; } // 名前の変更イベントの通知 protected void OnNamed() { if (Named != null) { _eventArgs = new NamedEventArgs(_name,_color); Named(this, _eventArgs); } } } }
// NamedEventArgs.cs using System; using System.Drawing; namespace ConsoleApplication1 { public class NamedEventArgs : EventArgs { // ネコの名前 protected string _name; // ネコの色 protected Color _color; // コンストラクタ① public NamedEventArgs(string name, Color color) { _name = name; _color = color; } // コンストラクタ② public NamedEventArgs() { _name = null; _color = Color.Empty; } // 名前プロパティ(読み取り専用) public string Name { get { return _name; } } // 色プロパティ(読み取り専用) public Color BodyColor { get { return _color; } } } }
// Program.cs using System; using System.Drawing; namespace ConsoleApplication1 { class Program { [STAThread] static void Main(string[] args) { Cat theCat = new Cat("ネコ",Color.White); // イベントハンドラのオブジェクトを生成する。 Cat.NamedEventHandler handler = null; handler = new Cat.NamedEventHandler(Cat_Named); // イベントハンドラをネコインスタンスと関連付ける。 theCat.Named += handler; // 鳴いてみる。 theCat.Mew(); // 名前をなしにする。 theCat.Name = null; // 名前を付ける。 theCat.Name = "ポチ"; // 再び名前を付ける。 theCat.Name = "クロ太郎"; } // イベントハンドラの実体 static void Cat_Named(object sender, NamedEventArgs e) { NamedEventArgs args = (NamedEventArgs)e; Console.Write("吾輩は猫である。"); switch(args.Name) { case null: Console.WriteLine("名前はまだ無い。"); break; case "ポチ": Console.WriteLine("名前はポチ。犬みたいな名前だな。"); break; case "クロ太郎": Console.WriteLine("名前はクロ太郎。白色なんだけど…"); break; default: Console.WriteLine("なんなんだろう?"); break; } Console.WriteLine(""); } } }
上記を実行すると、次のような結果となります。
にゃぁ 吾輩は猫である。名前はまだ無い。 吾輩は猫である。名前はポチ。犬みたいな名前だな。 吾輩は猫である。名前はクロ太郎。白色なんだけど…
【戻る】