はじめに
この記事は C# 初心者向け TIPS のまとめです。
僕はもともと C++er でしたが、ツール制作や Unity で C# を触るようになりました。
その際に調べたことなどを簡単にまとめたいと思います。
また、この記事は、C# ADVENT CALENDER 2015 の 15日目のものです。
1. event を上手く使おう
C# は event や delegete が存在しオブザーバーパターンのようなことが非常にしやすい言語です。
ですが、event は使いづらい部分もあります。
例えば event の登録のみ行い解除をしない場合メモリリークが発生することです。
event に登録してあると参照が残ってしまっており消したとおもったら消えていないという状況になることがあります。
結構気づきづらいことなので、意識して使う必要があります。
イベントの購読とその解除はメモリリークのことや、登録・解除にまつわる問題点などが記載してわかりやすかったです。
event はメリットもすごくある機能ですので、うまく制御して使いましょう。
2. struct はよく考えて使おう
C# には値型の struct があります。
struct は使いどきがわかりづらいものです。
調べたところ、MSDN のフレームワークの設計ガイドライン クラスまたは構造体の選択に下記の記述がありました。
型のインスタンスが小さく有効期間が一般に短い場合や、型のインスタンスが一般に他のオブジェクト内に埋め込まれる場合は、クラスではなく、構造体を定義することを検討します。
型が次に挙げるすべての特性を持たない場合、構造体は定義しません。
プリミティブ型 (整数、倍精度浮動小数点数など) に似た単一の値を論理的に表す。
インスタンスのサイズが 16 バイト未満である。
変更できない。
頻繁にボックス化する必要がない。
struct を使うべきか迷ったときは上記を覚えておくとよいかもしれません。
3. List<T> を返すときは Collection<T> や ReadOnlyCollection<T> を使おう
CA1002: ジェネリック リストを公開しませんというデザイン上の警告があり、List<T>で返すのは非推奨で下記のように述べられています。
System.Collections.Generic.List<T> は、継承ではなくパフォーマンスを目的としたジェネリック コレクションです。
System.Collections.Generic.List<T> には、継承クラスの動作を変更しやすくする仮想メンバーは含まれていません。
継承を目的としたジェネリック コレクションを次に示します。
公開するときは System.Collections.Generic.List<T> ではなく、これを使用してください。
System.Collections.ObjectModel.Collection<T>
System.Collections.ObjectModel.ReadOnlyCollection<T>
System.Collections.ObjectModel.KeyedCollection<TKey, TItem>
上記は拡張を開くためという理由ですが、ReadOnlyCollection は読み取り専用にする効果もあり、そういった際には積極的に使うべきかと思います。
Collection<T>やReadOnlyCollection<T>で、リストのプロパティを公開するにはもっと詳しい考察も記載されています。
4 #if よりも Conditional属性を使おう
define は、デバッグ版とリリース版を区別したり、プラットフォーム別処理を書いたりとよく使われる機能です。
ですが、場所によっては #if がネストしてしまうなど、#end の位置を気にしなければなりません。
さらに、関数を #if で囲んだ場合、呼び出し先にも #if を書かなければいけません。
こういった場合、Conditional を使うことで、簡潔に書くことができます。
詳しくは Conditional (C# プログラミング ガイド)をご覧ください。
おわりに
僕が C# を学び始めた時に書き留めておいたものから抜粋して、もっとよりよく書くための TIPS を記載してみました。
もしも間違っている点がありましたら指摘していただけると大変嬉しいです。
また、Effective C# などにももっとよりよいノウハウがたくさんありますので、気になる方は読んでみるとよいかと思います。