C#中括弧{}の意味


(サンプルコードは、Unity向けになります)
中括弧{} は、C#において様々な用途があるが、それらの意図はひとつである。

領域化である。

投稿では、この領域化を、国県市という三段階の親領域と子領域と孫領域に分けて説明していく。国は県を包括し、県は市を包括するという関係性だ。

投稿のサンプルコードには、スクリプトとしての実用性はなく、ただスコープ化の意味を理解するためだけに書かれている事に留意してください。

サンプルコードと図解

早速サンプルコードとそれを図解したものを用意しました。
サンプルコードは気合を入れて読解しようとする必要はありません。
下記の図解の方が重要です。

点線は{}と同義
実線は変数宣言
緑線は呼び出し(Startから開始してる)
赤線はアクセスできない
using UnityEngine;

public class 領域化サンプルクラス : MonoBehaviour{

public string 国変数1;  

// Unityでプレイボタンを押すだけで実行させる為
void Start()
{
    国のメソッド1();
}

void 国のメソッド1() {

    string 国変数1;
    
    void 県メソッド1()
    {
        string 県変数1;

        void 市メソッド1()
        {
            string 市変数1;
            Debug.Log("市メソッド1が実行されてるよ");
            //親領域の変数を参照する事ができる
            国変数1 = "国の変数を市が書き換えてるよ";
            市変数1 = "市が市の変数を書き換えてるよ";
            Debug.Log(市変数1);
        }
        void 市メソッド2()
        {
            string 市変数2;            
            Debug.Log("市メソッド2が実行されてるよ");
            //親領域の変数を参照する事ができる
            県変数1 = "県の変数を市が書き換えてるよ";
            市変数2 = "市が市の変数を書き換えてるよ";
            Debug.Log(市変数2);
            //↓の//を消してみてね。市変数1は、当領域または親領域の中で宣言れていないのでアクセスできずに、コンパイルエラーなる。
            //市変数1 = "市2が市1の変数を書き換えてるよ";
        }

        Debug.Log("県メソッドが実行されてるよ");
        市メソッド1();
        市メソッド2();
        Debug.Log(県変数1);
    }

    Debug.Log("国のメソッド1が実行されているよ");
    県メソッド1();
    Debug.Log(国変数1);
    //↓の//を消してみてね。市メソッドは、当領域または親領域の中で宣言れていないのでアクセスできずに、コンパイルエラーなる。
    //市メソッド1();

    //↓の//を消してみてね。市変数1は当領域または親領域の中で宣言れていないのでアクセスきずに、コンパイルエラーなる。
    //市変数1 = "子供だよ";
  }
}

実行結果

これらの事から、中括弧{}の仕様について、以下の事が結論出せます。

1. 上位領域から下位領域で宣言された変数やメソッドにはアクセスできない
2. 下位領域からは上位領域の変数やメソッドにアクセスができる
3. 兄弟領域(同じ上位を持つ領域)からは、相互にアクセスできない

中括弧に対する理解は、以上である。

「いやいや、別に何から何をアクセスされるべきなんて考える段階にないんだよ。」

と言うかもしれない。確かに、あなたはまだあなたの書いた変数が自分自身が書いたスクリプトによって、意図しない形で書き換えられるような心配はしていないかもしれない。

が、C#という言語は、言語レベルで領域化が強制されている。あなたは領域化への理解を強制されている。

では、実際にC#の言語仕様上、領域化強制されている部分を見てみよう。
これらだけは理解が不可避なはずである。

1. クラス内容の記述

class クラスの名前{
  //ここにクラスの変数やメソッドを記述する
}

上記サンプルにおいて、名前の後の{}を付けないとコンパイラエラーになる。

つまり、クラスの宣言をする以上は、クラスの内容を記述するのに領域化は必須である事が分かる。

つまり、「クラス」は、領域化とセットであり、必ず領域化のルールに従うことになる。

あなたが知らない間に書かされているクラス名の後の{}は、領域化をさせられていたのだ。

2.メソッドの処理内容の記述

void メソッド1(){
  //メソッドの処理内容を記述する
}

上記サンプルにおいて、メソッドの()の後の{}を付けないとコンパイラエラーになる。

つまり、メソッドの宣言をする以上は、メソッドの内容を記述するのに領域化は必須である事が分かる。

つまり、「メソッド」は、領域化とセットであり、必ず領域化のルールに従うことになる。(一部例外があるが割愛する)

さて、なぜclass宣言やメソッド宣言の後に中括弧が必ずあるかをご理解頂けただろうか?

これらの事を理解すると、色々な事が理解できるようになっているはずだ。

更に、領域のルールに従いながら、サンプルコードを自分でイジリ倒してみてほしい。

そこから、様々な気付きを得る事ができれば、きっとあなたの中にあったC#への不快感は一つまた一つ減る事であろう。

中括弧は、紹介した例以外でも、様々な状況で見る事になるだろうが、常にそれらは子領域を発生させているに過ぎない。そして、それらもすべて今日紹介した領域のルールに従う事になる。

そんな時にも落ち着いて、投稿の内容に立ち返って、その中括弧{}の意味を考えてみてほしい。


いいなと思ったら応援しよう!