- プロパティ(C#)
例えば、値を代入するとき0以下なら0に、255以上なら255にしたい場合、
int a; // フィールド void setA(int value){ // 関数の中で直接チェック if(value < 0){ a = 0; } else if(value > 255){ a = 255; } else{ a = value; } }
とするが、プロパティに記述することで、このような値のチェックなど、関数内で書くコードを軽減できる。
int _a; // フィールド int a{ // プロパティ get{return _a;} set{ if(value < 0){ _a = 0; } else if(value > 255){ _a = 255; } else{ _a = value; } } }
ここで、this.a = 2689;
のようにすると、2689がsetにvalue
として渡され、set内の条件分岐によって255が代入される。
- 自動実装プロパティ(C#)
int a{get; set;}
とすると、
int __a; int a{ get{return __a;} set{__a = value;} }
と宣言したのと同じことになる。ただ、これだと
int a;
と事実上意味は同じであり、自動実装プロパティの使いどころは、
int a{get; private set;}
のように、取得はpublicだが、代入はprivateというようにしたい場合など。
- Unityでの自動実装プロパティ
Unityでは、自動実装プロパティを使って
public int lifeMax{get; set;}
とすると、エディタ側のインスペクターに表示されない。([SerializeField]
を付けても同様)
Vexe Framework
などを使用してインスペクターをカスタマイズするか、自動実装せずに手で書く必要がある。
[SerializeField] int _lifeMax; public int lifeMax{ get { return _lifeMax; } private set { _lifeMax = value; } }
- LINQ(Language Integrated Query)(C#)
forやifなどが絡むコードを簡潔に(場合によっては1行で)書けるようにする機能。
using System.Linq;
を追加して使用する。
例えば、直前に選択したメニュー以外のメニューを全て非アクティブにするという処理の場合、以下のようにもなる。
LINQ不使用
for (int i = 0; i < menuList.Length; ++i) { if (i != (int)prevMenu) { menuList[i].SetActive(false); } }
LINQ使用
menuList.Where(x => x != menuList[(int)prevMenu]).ToList().ForEach(x => x.SetActive(false));
無論この場合、LINQのほうはリスト化しているのでパフォーマンスは少し落ちるが、1行で書け、ループカウンタが不要でバグが入りにくいコードになっている。
ただし懸案事項として、UnityでLINQを使用し、iOSの実機で動かした際にエラーになるケースが多数報告されている(下記記事内で対策も紹介されている)。
Unity+iOSでエラーになるLINQのまとめ