ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# 初心者の次のステップ

まったくのプログラム初心者が .NET + C# の最低限の文法を使って簡単なWindowsフォームアプリを作れるようになってくると「コードの中身をもうちょっとうまく作れないかな」「便利な機能をもう少し知りたいな」と思うようになってきます。

そこで、そうした際に手を出すと良さそうな次のステップをメモしておきます

Visual Studio での F12 と Shift + F12

クラスや関数や変数が呼び出されている場所で名前を選択してF12を押すと、宣言している場所に一発でジャンプしてくれます。違うドキュメントでも関係なくジャンプし、標準で組み込まれているクラスや関数でもジャンプしてくれるため、中身を調べる時に非常に便利です。

逆に、宣言している場所で名前を選択して Shift + F12 を押すと使用先をリストアップしてくれて、リストをダブルクリックでジャンプしてくれます。

どちらも非常に便利で必須です。

Visual Studio のステップ実行とウォッチリストの利用

初心者であっても、この2つはデバッグに必須になります

Visual Studio のプロジェクトのプロパティの利用

ツールの設定などを自前でテキストファイルやXMLjsonファイルで読み書きするような実装をしなくても、Visual Studio の機能でプロパティを定義しておけば、実行ファイル名 + exe.config というファイル名でツール本体と同じ場所に勝手に保存してくれます。中身はXML形式で記述されているようです。

Fontの情報をstringに変換してファイルに読み書きしたいと思っても、専用のコンバータ関数の利用がうまくいかなかくてこちらに頼ったりしました。

●ソリューション内に複数のプロジェクトを追加して切り替える

同じような機能をテストする場合などにいちいち新しいソリューションを作らずにプロジェクトを追加して、切り替えて実行するのが便利です。

ソリューションエクスプローラーのソリューションで右クリック>追加>プロジェクトで追加して、ソリューションで右クリック>プロパティでプロジェクトの並び順を変えたり実行するプロジェクトを指定できます。

●複数のクラスを扱う

1つのcsファイル内に複数のクラスを書いてnewして使ってみたり、1つのプロジェクトに複数のcsファイルを作ってnewして使ってみたり。

●ライブラリを導入してみる

NuGetから有名で初心者でも扱えそうなライブラリを入れて使ってみたり。

●英語と日本語が切り替えできるよう試してみる

フォームデザイナを使って環境に応じて変える方法と、言語設定を判断する変数を用意してツールチップやメッセージボックスの文章を全てifで分岐させる方法の両方とも試してみたり。

●一般的な設定ファイルを試してみる

「ini」「json」「xml」「yml」などがあります。
インポート / エクスポートの解説記事も探すとすぐ見つかります。

●テキストのバイナリファイルでの出力や暗号化

設定ファイルをユーザーが触れないようにしたい場合などに試してみると良いです。

●プロパティ

最初は「変数(フィールド)と何が違うのかよく分からん」という気持ちになりますが、それでも覚えるためにあえて使ってみると良いと思います。

定番な形として、変数はprivateで定義しておき実際にはpublicにしたプロパティで変数に対して値をget / setできるように記述しても良いですし、プロパティだけいきなり書いて利用してみるのでも良いと思います。

便利な点としては「getのみ」「setのみ」といった制限を与えられることと、getやsetの際に値を好きに加工することができる点かと思います。

●アクセス修飾子static

ツールの設定などを格納しておくためのクラスを作った際に、newせずに直接 get・set したい場合があります。値をメモリに常駐しておいていつでもアクセスできるようにする感じです。

●参照渡し

何かの関数の引数に変数の値だけを渡すのではなく、変数そのものを渡したい時が出てきます。そういう時に参照渡しを利用すると「あ、こういうことか」と理解できます。

●列挙体

よく例に挙げられるのは曜日ですが、monday~sundayといった汎用的に使う固有名詞の綴りをstring型で書いて渡すのは不便ですし綴りのミスを修正しようと思って探すような場合にも不便です。

そこで列挙体で定義しておいて登録順のindexで渡すという使い方ができます。

●構造体

色んな型のフィールドの集まりをまとめておくのに使います。

元々はそれだけの機能だったようですが、メソッドも定義できるようになったりしてクラスとの違いが初心者にはよく分からない感じになっています。「構造体 クラス 違い」みたいな単語で検索すると処理速度の違いとか細々とした仕様の違いについての解説が出てきますが、初心者の段階ではそこまでは知らなくて良いのかなと思ったりもします。

ジェネリック

色々な型をまとめて定義できるもの、とだけ覚えておくのでも良いと思います。

●イベントの自作

ボタンクリックイベントなどは何気なく利用していたと思いますが、イベントを自分で定義して使いたい場面が出てきます。

そうすると、理解しないといけないことが色々とあります。
例えばこちら。

・デリゲート
 コールバック
・匿名メソッド

こちらが参考になります。


ラムダ式

煩雑な記述を簡素化するスタイルですが、この存在だけでも知っておかないと調べものの際に「突然、謎の記述に遭遇した」ように見えて混乱します。

こちらの記事がとても分かりやすいと思いました。

ただ、ベテランプログラマな方に聞いても「書く側は楽で良いものの見る側にとっては可読性が悪い」ということでした。

LINQ

コレクションから簡単に望むものを取り出したり、中身を入れ替えたりと、コレクションに対して楽に柔軟に編集が可能になるもののようです。

調べものをするとたまに出てきて、ラムダ式で書かれていたりしていてよく分からないままコピペで利用することが多くなってきます。なのでラムダ式から学ぶと良さそうです。

LINQの記述が分かると、データベースとのやり取りやXMLとのやり取りがスマートに書けるようです。私の場合はこのあたりはまだちゃんと理解できていないまま使っていたりします。。

●非同期処理

ツールで何か時間のかかる処理を行っている間ツールが固まってしまい他の操作ができなくなります。それが長く続くと、ユーザーがツールをクリックした際に「応答がありません」と表示されて終了を促される状態になってしまいます(実際にはちゃんと処理を続けていて終了待ちだったとしても)。

そこで、固まらないようにしてプログレスバーを表示したり、処理中も触って問題ない他の機能を使えるようにしたりすると良さそうです。

そのために非同期処理が必要になってきます。

※随時更新