【Unity/C#】thisキーワードの使い道について簡単に紹介
インターネットでC#のコードのサンプルを漁っていると、たまに出てくる「this」の文字。
これってなんね? と初心者の頃に戸惑った記憶がかすかにあるような気がしないでもないので、自分のおさらいがてらthisキーワードについて簡単に紹介します。(「おさらいがてら」なんて言ってますが普通に使ってましたすみません)
C#のthisキーワード
C#ではthisキーワードを使って、そのインスタンス自身を参照することができます。例えばこんな感じ。
フィールド名として「fieldId」があったとして、『SetFieldValue()』のメソッドではフィールドに引数から値をセットしています。引数の名前も同じ「fieldId」なので、メソッド内で下のような感じにするとコンパイラが「どっちがどっちだか分からない!」と混乱してしまうんですよね。
thisキーワードをつけておくことで、そのインスタンス自身を表してくれるようになります。Unityの場合、同じゲームオブジェクトに同じスクリプトを1つアタッチする場合、以下のような書き方と似たようなイメージになります。
Unityではゲームオブジェクトにスクリプトをアタッチした時に、そのコンポーネントの数だけインスタンスが作られます。1つのスクリプトをアタッチすれば1インスタンス、2つのスクリプトをアタッチすれば2インスタンスです。
上の書き方だと、2つ以上同じスクリプトをアタッチした際に必ずしも自分自身を参照するとは限りません。というのも、GetComponentではゲームオブジェクトにアタッチされているコンポーネントを上から順番に確認していくので、最初に見つかった同名のインスタンスへの参照が返されるためです。例えば同じ名前のスクリプトが2つアタッチされていたとすると、2つ目のスクリプトからGetComponentした結果は1つ目のスクリプトになります。
なので確実に自分自身を指す場合はthisキーワードを使うのが便利です。
……同名のスクリプトを2つアタッチする状況が特殊すぎるので滅多に無いかもしれませんね(笑)
フィールド名の命名
thisキーワードを使って自分自身のフィールドを指すというのはよくあることですが、「そもそもフィールド名と引数の名前を変えておいた方がいい」というのもひとつの考え方です。
例えば以下のような感じですね。
フィールド名と引数の名前が異なっていればthisを使わなくても区別できます。
今回のケースだと「id」が指すものは「fieldId」だけなので呼び出し側でも混乱することは無いですが、フィールドとして「guid」だったり「materialId」といった形で複数のタイプのIDが存在していると、呼び出し元ではどれにセットしているか分からなくなることも。多くの場合はメソッド名で「SetFieldValue」とか「SetMaterialValue」のように区別しているかと思いますが、引数単体で見た時に何のIDなのか分かるようにしておいた方がコーディング時の混乱を減らせると思います。
また、フィールド(メンバ変数)を区別するために、変数名の先頭に「m_」をつけるやり方もあります。
例えばこんな感じ。
この場合だと引数が何のIDなのかが分かる上に、フィールド名の中にも「fieldId」という情報が表現されています。
ローカル変数と区別する意味でも、フィールドとして持っている値であることが分かりやすいんですよね。
今でこそ「区別されていて分かりやすい」なんて言えますが、プログラミング初心者の頃は「m_ってなんやねん……」とずっと思っていました。ちなみに「_」のようにアンダースコア1文字で表現する人もいます。
C#だと「m_」と接頭辞を付けることはあまり無いので、CやC++などから戦っている歴戦のプログラマーたちが使うことが多いかもしれません。
C#の命名規則はプロジェクトでの規則を優先すべきですが、特に定められていないのであればMicrosoft社が使っているコーディング規則に合わせるのが良いかもしれません。
C#のコーディング規則
フィールドのデザイン
まとめ
thisキーワードの使い方について、超簡単に紹介しました。自分自身のインスタンスを参照したい時には便利なキーワードなので、フィールドに値をセットするときに引数の名前と区別する目的で使うこともあります。
無理して使うタイプのものではないので、使うタイミングがあれば試してみてください。
ゲーム開発の攻略チャートを作りました!
-
前の記事
【Unity】TransformのSetParentで親子関係を設定して表示を整理する 2021.01.24
-
次の記事
【Unity】TransformのSetSibling系メソッドを使って要素の順番を変える 2021.01.26
コメントを書く