[Unity]よく見るC#のわかりにくいキーワード

C#のちょっとわかりにくいキーワードの簡単な説明です。ほかのオブジェクト指向言語でも、あったりなかったり仕様が若干違ったりすることがありますのでまとめました。
Unityで自分で実装する分にはあまり気にしなくてもいいんですが、アセットのプログラムを読んでいるとよく出てくるので、なんとなくでも理解していないと何をしているのかがわかりません。
とりあえず、詳しい説明は置いておいて、こういうのがあるんだな!ということを理解して、何をキーワードにして調べればよいのかを目的としたのが本記事の趣旨です。

・アクセス修飾子
外部や子クラスからのアクセス権です。
以下のようなものがあります。

名称意味
public制限なし
protected派生した型からアクセス可能
internal同一アセンブリ(※1)からのアクセス可能
protected internal同一アセンブリ(※1)と包含クラス(※2)の派生型からアクセス可能
private自身のクラス内のみ
private protected包含クラスと包含クラスから派生した型からアクセス可能

※1)DLLとかライブラリ ようは、外部から呼んでくれるなという場合に使う  ※2)クラスのオブジェクトをメンバとして持っている

まぁ、普通はpublic,private,protected あたりを知っていれば十分かと思います。

・オブジェクト指向と仮想関数の取り扱い
C#ではNew と virtual + override 2つの方法で仮想関数を実装できる。
子クラスでNewでメソッドを上書きした場合、インスタンス化したオブジェクトの型によって親クラス、子クラスのメソッドのどちらにアクセスするか決まる。
子クラスでインスタンス化して親クラスでキャストしてからアクセスした場合、親クラスのメソッドが呼ばれる。

virtual+overrideで作った場合は子クラスのメンバが優先される。親クラスのメソッドを呼びたい場合はbaseでアクセスする。

・abstract
abstractは抽象メソッド/抽象クラスで親クラスで定義だけして、子クラスで必ず中身を実装しなさいという意味。abstractがあるクラスはインスタンス化できない。

・ジェネリック
中身や引数の数は同じだけど、引数や戻り値の型が違う関数をいちいち全部作るのは面倒!というときに使う。
UnityだとGetComponent()とかでおなじみ。

・Attribute
クラスとかメンバの前についてる鍵カッコでくくったやつですが、基本的にはユーザーへの周知やコンパイラ、エディターなどに渡す情報が入ります。
例えば…
[Obsolete] class OldClass {} … 古いバージョンとの互換性のためだけに残してるけど、このクラスはもう使わないで。
というような類のことを警告したいときに使われるものです。
たくさんあるけど、意味はググれば大体わかるはず。
Unity用のものはこの辺りを見ていけばわかるはずです。
属性

・getter/setter(プロパティ―)
カプセル化のための仕組みの一つ。アクセスにread/write属性がつけられる。

・namescape/using(名前空間)
1つのプロジェクトで、クラス名がかぶっちゃっても、名前空間を別にしておけばそれぞれ使える。
他人の作ったアセットとクラス名がかぶっちゃわないように、とりあえずくくっておくとよい。
名前空間をいちいち書くのが面倒という場合は、using で宣言すればいちいち書かなくても使えるようになります。

・ラムダ式(匿名関数)
普通は、メソッドに値を渡しますが、メソッドを渡せたら便利だよね…という感じのもの。
例えばこんな感じに書ける

    var list = new List<string>(); // このListの各要素に".txt"をつける
    var result = list.Select((string s) => { return s + ".txt"; });

これ”=>”(アロー演算子)が出てきたらラムダ式ですね。

・メソッドチェーン
メソッドが自分自身のインスタンスを返すものであれば、変数名を省略して以下のようにつなげて各メソッドを実行できます。

sample.a().b().c();

sampleクラスのメソッドをa(),b(),c()という順番に実行しています。

・コルーチン(IEnumerator)
たとえばUnityの場合、関数はすべて1フレーム内で実行されることが前提になっています。
ですが、ちょっとづつ暗くして言ってフェードアウトする、とか、超複雑な計算処理、みたいな複数フレームにまたがった処理をしたいシチュエーションは結構あるはずです。
もちろん、カウンターやステータスを作ってUpdate()関数の中でステータスに従って処理を変えるという実装もあるかと思いますが、面倒ですよね。ということで出てきたのがコルーチンという概念。なんと関数の途中でいったん終了できて、あとでその場所から再開できるという、ノイマンさんもびっくりなとんでもない悪魔の所業を実装できるんです。それがC#にあるIEnumeratorです。

コルーチン

外部のassetとかのコードを読んでいくとこういうのがいろいろ出てきます。
最初は何だこれと思いますが、慣れれば内容的には大したことなかったりしますので、落ち着いてリーディングしていきましょう。

コメント