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#ならではの文法を紹介していきたいと思います!

C#:オブジェクトの中身をコピーする方法(MemberwiseCloneメソッド実装)

参照型変数(主にクラスのオブジェクト)をコピーする場合、単純に「=」で代入するだけでは不十分な場合があります。
参照型変数の中身は参照先(オブジェクトのメモリ領域を示すポインタ)です。
「=」で代入するだけでは、参照先だけがコピーされて、参照しているものは同じという状態になるので、コピー先の変更がコピー元に影響してしまいますし、その逆にコピー元の変更がコピー先に影響してしまいます。

これを避けたい場合は、MemberwiseCloneメソッドを用いて中身を丸ごとコピー(新たにメモリ領域を確保し書き込み、ディープコピー)する必要があります。
MemberwiseCloneメソッドはobject型で定義されており、C#ではすべての型はobject型から派生しているので、特別な記述を行わなくともMemberwiseCloneメソッドを使用できます。ただし、戻り値はobject型なので、キャスト等の考慮は必要です。
(javaの場合はこちらの記事のようにインターフェースの実装が必要だったり例外処理が必要だったりと色々面倒です。後発言語であるC#では言語仕様上ディープコピーを始めから考慮している印象を受けます。)

以下、サンプルコードです。
参照先のみコピーした場合とMemberwiseCloneメソッドで中身をコピーした場合を比較しています。
参照先のみコピーした場合は、コピー後にコピー先を変更した際にコピー元が影響を受けていますが、MemberwiseCloneメソッドで中身をコピーした場合は影響を受けていません。

【サンプルコード】

・CloneableItem.cs

・ItemCloneMain.cs

【実行結果】


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

C#は後発言語であるため、記述を簡略化できる場面が多いです。
今回紹介したディープコピーの例もそうですし、getter・setterの記法もC#だと簡略化できます(今回のサンプルコード中にも出てきます)。
javaを触った後にC#を触ると、こうした細かい所で便利さを感じます。

これからも、C#に関する記事を投稿していきたいと思います!

Excel・VBA:始めてのマクロの作り方(Hello World)

Excelのマクロ(VBA)の作り方の紹介です。
マクロを使える設定にしてから、「Hello World」をポップアップで表示するボタンを作成し、保存する所まで紹介します。
Excelのバージョンは Excel 2013 とします。

手順1:マクロを開発可能にする

Excelの任意のファイルを開き、「ファイル」タブを開く。
「ファイル」タブの「オプション」を選択する。

オプションが表示されるので、「リボンのユーザー設定」タブを選択し、「開発」のチェックボックスをONにし、「OK」を押下する。

手順2:マクロ有効ブックとしてファイルを保存する

「ファイル」タブを開き、「名前を付けて保存」を選択する。
保存する際、ファイルの種類を「Excel マクロ有効ブック(*.xlsm)」を選択する。

手順3:ボタンを作成する

「開発」タブの「挿入」から「ボタン(フォーム コントロール)」を選択する。

任意の場所にボタンを作成すると、「マクロの登録」ウインドウが開く。
ここで「新規作成」を選択する。

ソースコードの入力画面に遷移するため、下記のように記述する。
(ボタンの名前が「ボタン1」の場合)

手順4:ボタンの稼働確認をする

手順3で作成したボタンをクリックする。
「hello world!」と書かれたポップアップが開くことを確認する。


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

今回の例はごく平易です。
しかし、ここまでできるようになれば、プログラム言語の経験者であれば自分で調べながら実務レベルのマクロを作ることができるようになります。
VBAはプログラム言語の一つですので一般的なプログラム言語に備えられている機能は一通り揃っていますし、それをセル参照・更新の機能と組み合わせれば、色々な作業の自動化が可能になります。

これからも役に立つ情報を発信していきたいと思います!

C#でのHelloWorld(フォームアプリ)

今回は、C#のフォームアプリについて、HelloWorldを表示するアプリケーションを作成したいと思います。
単純に手順通りにHelloWorldを表示させるだけだと今後の開発でつまずきかねないので、「Visual Studio Community」というIDEが何をしていてなぜ動くのかということも簡単に補足しています。

【手順】

1.Visual Studio Community を開く。

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

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

4.画面左の「ツールボックス」をクリックしてツールボックスを表示させる。

5.ツールボックスの「すべてのWindowsフォーム」から「Button」をクリックし、Form上にドラッグする。同様に、「Label」をクリックし、Form上にドラッグする。「Label」に関しては、右下のプロパティの「Text」で表示されている文字を削除しCtrl+Sで保存する(ここに書かれている文字はフォーム上で初期状態で表示される)。

6.Form上のボタンをダブルクリックするとソースコードの編集画面になる。ソースコードは下記を入力する。入力したらCtrl+Sで保存する。

7.「開始」ボタンをクリックしてビルド・実行。ボタンをクリックし、ラベルに「Hello World!」と表示されることを確認する。


余談ですが、フォームアプリは「Visual Studio Community」が無くても作成可能です。
「System.Windows.Forms」がフォームアプリ用の共通部品を提供するクラスであるため、このクラスを取り込めばフォームアプリは作成可能です。
例えば、通常のテキストエディタで下記のソースコードを作成し、コンパイルすると、何もないフォームを作成できます。

「Visual Studio Community」を使用してフォームアプリ開発を行う理由は、「Visual Studio Community」が無いと開発できないからではなく、視覚的に操作でき共通処理も全て自動で記述してくれる「Visual Studio Community」の機能を用いることで生産性が劇的に向上するため、と言うことができます。

【サンプルコード】

・Sample.cs

・コンパイルコマンド


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

実際に作ってみて、簡単にGUI機能を持ったアプリを作れて驚いたというのが素直な印象です。
C#を仕事で使う必要がなかったとしても、ちょっとしたツールを作るためにC#を覚えるというのも良いと思いました。
C#の文法もjavaに似ていて覚えやすいので、java経験者であればその意味でつまずきにくいというのも大きな利点です。

これからも、C#について紹介していきたいと思いますので、よろしくお願いします!