C#:Mutexでの排他制御

排他制御の方法の一つとして、C#にはMutexと呼ばれる機能が用意されています。
何れか一つのスレッドがMutexによるロックを取得することができます。
他のスレッドによりロックが取得されている場合の処理を別途記述すれば、この機能を使用して排他制御が可能となります。

以下、サンプルコードです。

【サンプルコード】

【実行結果】


また、Mutexには、名前を付けることができます。
名前を付けることで、プロセス間でも排他制御が可能となります。
ただし、意図せずMutex名が被ると意図しないロックがかかってしまうため、扱いには注意が必要です。

【サンプルコード】

【実行結果】

※exeファイルを3回起動した結果。
 1つ目のプロセス…掴んで解放
 2つ目のプロセス…解放を待って掴んで解放
 3つ目のプロセス…解放を待って掴めず諦める


いかがでしたでしょうか?

C#には排他制御のための機能が色々と用意されています。
その内の一つが今回紹介したMutexであり、名前を付けることでプロセス間の排他制御も可能になります。
名前付きMutexは、プロセスをまたいだスレッドの制御だけでなく、同じ画面が複数立ち上がらないようにする、といった使われ方もします。
仕組みが単純なので使用しやすく、排他制御の機能の中では使用頻度は高いと思います。

排他制御の機能は他にも色々と用意されているので、今後も紹介していきたいと思います!

C#:イベントハンドラとは

イベントハンドラとはC#で標準で用意されている文法であり、イベント送受信の処理を記述するために用意されています。

クラスAでボタンのクリック等のイベントを発行する

クラスBはクラスAからイベントを受け取り業務処理を行う

クラスBは業務処理終了時にクラスAに何かしらの処理を返す

という動きを実現するための文法です。

文法的にはdelegateの応用であり、
public delegate void EventHandler(object sender, EventArgs e);
というdelegateが標準で用意されていると考えて問題ありません。
(自分で上記の定義を行っても同じ動きをします)
なお、”object sender”とは業務処理を行ったオブジェクト、”EventArgs e”とはイベント発行側のクラスに返すデータ、を指します。

上記の通り、イベントハンドラとは、引数に object sender と EventArgs e を持つdelegateです。
そのため、delegateを理解していれば、イベントハンドラの文法も理解できます。
自分で使うかどうかは別として、Visual Studio で Windows Form を作成した時に自動生成されるソースコードや、他の人のソースコードを読む分には問題ないでしょう。

以下、サンプルコードです。

【サンプルコード】

・Program.cs

・EventReceiver.cs

【実行結果】


いかがでしたでしょうか?

イベントハンドラはC#で画面開発をしていると良く出てくる文法なのですが、馴染みのない人も少なくないかと思います。
イベントハンドラはイベント送受信のためのものであること、文法的には以前に紹介したdelegateの応用であることさえ押さえれば、保守開発等で出くわしてもとりあえず対応できるのではないかと思います。

これからも、C#ならではの文法を紹介していきたいと思います!

C#:WPFでのHelloWorld

以前の記事では、WindowsFormでのHelloWorldを試しました。
今回の記事では、WPFでのHelloWorldを試してみます。

WPFはWindowsFormの後発にあたるWindows向け画面アプリの形式であり、画面がXAMLというマークアップ言語で記述されていること(C#で記述されている場合に比べて見やすい)、MVVM(UIに対しては単一スレッドでしか操作できない、リストが長く画面に表示しきれない場合に表示されている分のオブジェクトしか生成されない、といったUIの制約を意識せずにビジネスロジックを書くための手法)を実現しやすいこと、が特徴となっています。

以下では、Visual Studio Communityを使用したHelloWorldの手順を紹介します。
操作感はWindowsFormと似ているので、注意する箇所だけ詳細に書きます。
XAMLの項目とクラスの値をバインドさせる(クラスの値が変更された際にXAMLの画面上に反映する)点がミソです。

【手順】

1.Visual Studio Community を開く。

2.「ファイル > スタートページ」でスタートページを表示させ、スタートページ上の「新しいプロジェクトを作成」をクリック。

3.「WPF アプリ」を選択する。名前は任意で良い。これで「OK」を押下すると、「場所」で指定した場所にプロジェクト(作業フォルダ)が生成される。

4.ボタンやラベルを配置する。すると以下のようなXAMLが生成される。

・MainWindow.xaml

5.下記のクラスを作成する。

・MainWindow.xaml.cs

・MainViewModel.cs

・MainModel.cs

※補足

バインドさせる際には、「ReactiveProperty」を使用すると便利です。
自分で「NuGet パッケージの管理」から落とす必要があります。

【実行結果】

ボタン押下で「Hello World!」が表示されます。


いかがでしたでしょうか?

C#の画面アプリと言えばWindows Formという感じがしますが、今から始めるなら機能面で強化されているWPFの方が良いかもしれません。
昔は日本語の文献が少なく導入に苦労するという話もありましたが、現在は文献も充実しており、ネット上でも参考になる文献を見ることができます。

次回も、C#の便利な文法を紹介していきたいと思います!

C#:デリゲートの説明(Action・Func、マルチキャストデリゲート含む)

デリゲートとは、一言で言えば「関数を変数として扱う」機能です。
個人的には、「1つの関数のみを定義したクラスやインターフェースのようなもの」と捉えた方が分かりやすいと思います。

実務ではコールバック(本処理の終わりに特定の終了処理をさせる)をさせたい場合に使用されることが多いです。

以下はサンプルコードです。
理解を助けるためにコメントを入れているので、それもご参照ください。

【サンプルコード1】

【実行結果1】


引き渡す関数は匿名メソッドやラムダ式でも記述可能であり、これらを利用することで関数の定義を省略することができます。

また、引き渡された関数を受け取る際、.Netで用意されている以下のジェネリック定義を使用することができます。
ジェネリック定義を使用することで、デリゲートを省略することができます。

・System.Action型

戻り値がない場合に使用
Action、Action<引数1>、Action<引数1,引数2>…等

・System.Func型

戻り値がある場合に使用
Func<戻り値>、Func<引数1,戻り値>、Func<引数1,引数2,戻り値>…等

以下は、ラムダ式とSystem.Func型を使用し、サンプルコード1を簡略化する例です。

【サンプルコード2】

【実行結果2】


引き渡す関数は、+演算子で追加したり-演算子で削除したりすることもできます。
(マルチキャストデリゲート)

以下、+演算子や-演算子を試してみた例です。

【サンプルコード3】

【実行結果3】


いかがでしたでしょうか?

デリゲードはjava経験者にとっては馴染みのない文法なので、記事にしてみました。
繰り返しになりますが、「1つの関数のみを定義したクラスやインターフェースのようなもの」として捉えると、理解しやすいと思っています。

これからも、C#ならではの文法を紹介していきたいと思います!

C#:数値リテラルの一覧

javaでは数値リテラルの扱いに注意が必要になることがあります。
C#の仕様も気になったので、一覧にまとめてみました。

javaとの違いは以下の通りです。

・整数型に符号無し(u)、実数型にdecimal型(m)も指定できる

 ※decimal型は丸め誤差が発生しない実数型、javaで言うBigDecimal

・整数型の場合、精度や符号有無を自動判定する

なお、以下のように、接尾辞・小数点無しの数値同士の計算結果を実数型の変数に格納する場合に、整数型として計算されてしまい小数点以下で切り捨てられてしまうのはjavaと同じなので、注意が必要です。

【サンプルコード】

・Program.cs

【実行結果】


いかがでしたでしょうか?

数値リテラルの扱いを見ても、javaに近いことがわかります。
基本的には、javaの仕様を拡張したものであると考えて良いでしょう。

今回の記事とは直接関係ありませんが、decimal型がサポートされているのはありがたいです。
(javaのBigDecimal型は扱いが難しく、バグも発生しやすかったので)

これからも、C#ならではの文法を紹介していきたいと思います!