SQLの窓

2013年09月05日


コンソールアプリケーション(C#) で、クラス、デリゲート、イベント、ラムダ式の振舞いを理解する

コンソールアプリケーションで、ループしてコマンド毎に処理を行うと言うのは昔から良く書かれたコードですが、クラスを使ってクラスのメソッド内でループし、コマンドに対応する処理はイベント扱いにして、クラスのインスタンスを作成した側でイベント登録して処理を実装しています。

❶ public delegate void AppHandler( string cmd );

イベント( メソッド ) の形式を定義しています。

❷ public event AppHandler DisplayArg = null;

delegate を使って定義されたイベントを格納する為の公開変数を定義しています

❸ DisplayArg(line);

DisplayArg イベントをクラス内から呼び出しています。

❹ app.DisplayArg += arg1; と app.DisplayArg += arg2;

二つのメソッドをイベントとして追加し、クラス内の呼び出し記述は一つですが、二つとも呼び出されます。

❺ app.Select += (string cmd) => {}

メソッドの定義をせずに、ラムダ式を使って匿名のメソッドを作成してその場に記述しています

▼ エントリポイント
using System;
using System.Collections.Generic;
using System.Data.Odbc;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
	public class Program
	{
		// 引数
		public static string[] args;
		// DB接続文字列
		static string cs = "Driver={MySQL ODBC 5.2 Unicode Driver};" +
			"Server=localhost;" +
			"Database=lightbox;" +
			"Uid=root;" + 
			"Pwd=パスワード;";

		static void Main(string[] args)
		{
			// 引数を保存
			Program.args = args;

			App app = new App();
			// 単純にメソッドを追加
			app.DisplayArg += arg1;
			app.DisplayArg += arg2;
			// イベントの追加を明示する
			app.OpenDb += new App.AppHandler(open);

			// ラムダ式による実装( 手間を考えると、new は省いたほうが良い )
			app.Select += (string cmd) =>
			{
				Console.WriteLine(cmd + " が実行されました");

				// select の結果を表示する
			};

			// ******************************************
			// 終了せずに、コマンドプロンプトを保持する。
			// ( "q" で終了 )
			// ******************************************
			app.Loop();

		}

		// ******************************************
		// 引数の表示を行うイベント
		// ******************************************
		static private void arg1( string cmd )
		{
			Console.WriteLine(cmd + " が実行されました");

			// 引数の数
			Console.WriteLine("引数の数 : " + Program.args.Length);

		}
		static private void arg2(string cmd)
		{
			// 引数を全て表示
			int len = Program.args.Length;
			for (int i = 0; i < len; i++)
			{
				Console.WriteLine(Program.args[i]);
			}

		}

		// ******************************************
		// データーベースを開くイベント
		// ******************************************
		static private void open(string cmd )
		{
			Console.WriteLine(cmd + " が実行されました");

			using (OdbcConnection cn = new OdbcConnection(Program.cs))
			{
				try
				{
					cn.Open();
				}
				catch (Exception ex)
				{
					Console.WriteLine(ex.Message);
				}
				Console.WriteLine("State={0}", cn.State);
			}
			Console.WriteLine("処理が終了しました");
		}
	}
}


▼ クラス
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
	class App
	{
		public delegate void AppHandler( string cmd );
		public event AppHandler DisplayArg = null;
		public event AppHandler OpenDb = null;
		public event AppHandler Select = null;

		// ******************************************
		// コンストラクタ
		// ******************************************
		public App()
		{
		}

		// ******************************************
		// 終了せずに、コマンドプロンプトを保持する。
		// ******************************************
		public void Loop()
		{
			while (true)
			{
				// 専用プロンプト
				Console.Write("app>");
				string line = Console.ReadLine();

				// 終了コマンド
				if (line == "q")
				{
					break;
				}

				// 引数情報表示
				if (line == "arg")
				{
					if (DisplayArg != null)
					{
						DisplayArg(line);
					}
				}

				// DBを開く
				if (line == "open")
				{
					if (OpenDb != null)
					{
						OpenDb(line);
					}
				}

				// select 実行の表示
				if (line == "select")
				{
					if (Select != null)
					{
						Select(line);
					}
				}

			}
		}
	}
}

関連する記事

+= new EventHandler(Method) vs += Method
( どちらでも同じだという英文の記事です )


【VS(C#)の最新記事】
posted by lightbox at 2013-09-05 22:47 | VS(C#) | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり