変数はプログラミングを組むうえで重要ですが、プログラム内で定義した変数にはスコープと呼ばれる「有効範囲」が存在します。この記事ではプログラミング初心者が知っておくべき、「変数のスコープ」について、サンプルを交えながら解説します。
変数の有効範囲とは
これまで触れてきませんでしたが、定義した変数には「有効範囲」というものがあります。変数の有効範囲は「変数が利用可能なソースコードの範囲」を言っています。これを「変数のスコープ」と呼んでいます。変数は定義したらどこでも使用可能というわけではなく、使用の範囲が限定されている場合がほとんどです。
具体的には「波括弧」に囲まれた間が「変数のスコープ」になります。
現時点ではこの知識を知っておけば十分になります。プログラマーとして働くことを考えるならば、「変数のスコープ」も考えて適切な有効範囲で宣言するようになる必要がありますので、当記事の内容をしっかりと理解しておきましょう。
if文で変数のスコープを調べてみよう
では、早速ですが変数のスコープについて調べていきます。まずは新規のコンソールアプリケーションを作成して以下のコードを記述して実行してみてください。まずはif文で変数の有効範囲を調べてみます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App01
{
class Program
{
static void Main(string[] args)
{
int sampleValue = 1;
if(true)
{
Console.Write("if文の中:");
Console.WriteLine(sampleValue.ToString());
}
Console.Write("if文の外:");
Console.WriteLine(sampleValue.ToString());
Console.ReadLine();
}
}
}
これは問題のないパターンでしたね。わかりやすいように、「if文の中」「if文の外」の次に数字を出力するようにしてみました。これはint型の「sampleValue」がif文(波括弧)の外で宣言されているため、if文の中・外関係なく数字の出力が可能です。
では、上記のプログラムを書き換えて以下のようにしてみます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App01
{
class Program
{
static void Main(string[] args)
{
//int sampleValue = 1;
if(true)
{
int sampleValue = 1;
Console.Write("if文の中:");
Console.WriteLine(sampleValue.ToString());
}
Console.Write("if文の外:");
Console.WriteLine(sampleValue.ToString());
Console.ReadLine();
}
}
}
これは問題がありプログラムの実行ができないパターンになります。先ほどはif文の外側でsampleValueを宣言していたので使用できましたが、今回はif文の中でsampleValueを宣言しています。
原則は波括弧の中、になりますのでif文の外では、sampleValueの値を使用することはできません。これが「変数のスコープ」になります。変数には有効範囲がある、というのがよくわかる例ですね。では最初の実行可能なコードに戻しておいてください。
for文で変数のスコープを調べてみよう
次はfor文で「変数のスコープ」を調べます。先ほどのサンプルで「波括弧の中」という原則がわかったと思いますが、今回はその原則がfor文でも通用するかをチェックしてみましょう。新しいコンソールアプリケーションを作成して以下を記述してみましょう。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App27
{
class Program
{
static void Main(string[] args)
{
int sampleValue = 1;
for(int i = 1; i <= 10; i++)
{
Console.Write("for文の中:");
Console.Write(i.ToString() + "回目:");
Console.WriteLine(sampleValue.ToString());
}
Console.Write("for文の外");
Console.WriteLine(sampleValue.ToString());
Console.ReadLine();
}
}
}
上記を実行すると問題なく処理が行われます。if文の時と同様に「for文の外」「ループ回数」「for文の外」とガイダンスを画面に表示するようにしてみました。では、上記のサンプルを以下のように変更してみます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace App27
{
class Program
{
static void Main(string[] args)
{
//int sampleValue = 1;
for(int i = 1; i <= 10; i++)
{
int sampleValue = 1;
Console.Write("for文の中:");
Console.Write(i.ToString() + "回目:");
Console.WriteLine(sampleValue.ToString());
}
Console.Write("for文の外");
Console.WriteLine(sampleValue.ToString());
Console.ReadLine();
}
}
}
このように変更してみると、プログラムを実行することはできません。if文の時と同様にsampleValueをfor文の外側から内側に移動させたので、原則が適用されて使用不可になっています。
「波括弧の中」という原則はfor文にも適用されることが判明しました。「変数のスコープ」が明確になりますね。変数は宣言された箇所の一番近くにある波括弧の中が有効範囲になる、ということになります。初心者はよくこの原則を忘れてしまい、有効範囲外の場所で変数を使用しようとすることがあるので気を付けましょう。