Unity Engine #0 C#
このノートは主にC#言語についてです。Unityの特性を完全に理解するには、C#言語から始める必要があります。この部分は型にはまった内容ですが、プログラムのパフォーマンス向上と動作の理解に大いに役立ちます。
型
基本概念
C#では2種類の型に分かれます。
値型:int, short, long, sbyte, bool, float, char, struct, enum
参照型:string, object, delegate, interface, class, array
以下の違いがあります:
- メモリスタック:スレッドスタック、値型と参照型のマネージヒープ内のアドレスを格納。スタック上の値型はスコープ終了後にクリーンアップされ、効率が高い。
- マネージヒープ:参照型を格納。マネージヒープ内のオブジェクトはガベージコレクタ(GC)が管理・解放する。
値と参照
- 単独の値型変数(例:関数のローカル変数)はすべてスタック上で管理される。
- 値型がカスタムclassのフィールド・プロパティである場合、スタックに独立して格納されず、参照型とともにマネージヒープに格納される。
- すべての参照型はマネージヒープに格納される。
- 値型変数を別の変数に代入(またはパラメータとして渡す)と、値のコピーが実行される。参照型変数を別の参照型変数に代入すると、コピーされるのは参照オブジェクトのメモリアドレスなので、代入後は複数の変数が同じ参照オブジェクトインスタンスを指す。
outとrefキーワード
- outとrefはどちらもコンパイラにパラメータのアドレスを渡すよう指示し、動作は同じ。
- refは使用前にパラメータを明示的に初期化する必要があり、outはメソッド内で初期化する必要がある。
- outとrefはオーバーロードに使えない。
String型
stringは参照型として特別な性質があります。stringの変更は実際には新しいstringをnewしています。新しい参照型をnewするたびにヒープに新しい領域が確保されます。頻繁に文字列を変更する場合は、Stringの代わりにStringBuilderクラスを使用します。
ガベージコレクタ / GC
GCはC#に組み込みのガベージコレクタです。メモリ内で使用されなくなった内容を管理します。GC操作はパフォーマンスに大きく影響するため、GCを避けるべきです。
ボクシング / アンボクシング
ボクシングは値型を参照型、またはその値型が実装するインターフェース型に変換する過程です。アンボクシングはその逆です。ボクシングとアンボクシングは実際にGCを増やします。ボクシング・アンボクシング操作を減らすべきです。
