第5講 メソッド(1)
第8話 変数のスコープ
前話の謎を解くためには、
変数のスコープの話をしなければなりません。
この話はなぜC言語がプログラム言語のキングオブキングになったかと関係します。
変数のスコープとは、変数の適用範囲であることを前に説明しました。
このことを説明するためにコードを次のように変更していただく必要があります。
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int x; //xは整数を入れる箱
x = 3;
Console.WriteLine("x={0:d}", x);
f();
Console.WriteLine("x={0:d}", x);
}
static void f()
{
x = 5;
}
}
}
変更すると、
とaのところに赤い波線が付いてしまいますね。
そして、Ctrl+F5をすると、
とビルドエラーが発生します。
ビルドエラーが発せいたときには、
いいえを選択して下さい。
選択すると、一番下に
とエラー原因が指摘されます。
main()で
そして、
とでてきます。
右の方にエラーした文の番号がでいます。
つまり、
x = 5;
に問題があるのだといっているわけです。
C言語やC++で同様なプログラムを組んだ時のエラーメッセージは
です。
C#で
と指摘しているのは、同じであると考えて下さい。
すると、初心者の方は、
int x; //xは整数を入れる箱
で箱の用途をちゃんと宣言して定義したはず!と納得できませんね。
実は、変数のスコープ(範囲)はメソッド内に限定されているのです。
つまり、aのスコープは
図の赤い}に限定されているのです。
エラーを解消するために、コードを次のように変更して下さい。
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
int x; //xは整数を入れる箱
x = 3;
Console.WriteLine("x={0:d}", x);
f();
Console.WriteLine("x={0:d}", x);
}
static void f()
{
int x; //xは整数を入れる箱
x = 5;
}
}
}
今度は赤い波線も消えてビルドエラーも発生しませんが、
実行結果は、
x=3
x=3
です。
どうして、
x = 5;
が生きないのでしょうか。
理由はおわかりですよね。
そうです。スコープです。
スコープすなわち変数の適用範囲は基本的にメソッド内に限定されている!です。
同じ名称のxでも実は、別の箱です。
箱は社員専用の箱でして、
他の社員は使うことが原則として出来ないのです。
社長が用意した箱や社員が用意した箱は、
その用意した人専用の箱なのです。
前話で引数を使い値を渡しましたが、
実は箱そのものを渡したのではなく、
あくまで箱の中身の値を渡したのにすぎないのです。
基本的には箱は用意した社員専用ですし、
箱は渡せないのです。
絶対的な権限を持つ社長であるMain()でさえ、
社員の箱を勝手に使うことは出来ないのです。
スコープをメソッド内に限定した−−−
これがC言語やC++がプログラム言語のキングオブキングになった最大の理由です。
そして、VBやC#はここから学んだのです。
(しかも、基本的には他の社員が用意した箱は使えないはずなのに、
許可を与えて使用をさせる方法も考えたことが、
C言語またはC++が永らく愛されてきた理由なのです。
箱は渡せないのに、箱を使用することを可能にする魔法の方法を
C++は備えているのです。
C#も同じです。)
どうして、スコープをメソッド内に限定した、
つまり、箱を社員専用のものにしたことが、
C言語およびC++の成功の素になり、
VBやC#は真似たのでしょうか。