グローバル変数はMain関数で宣言されることが多く、そのスコープはコード全体です。ローカル変数は、変数が宣言されているブロックステートメントまたはメソッドの最後にある中括弧({})を閉じる前にスコープ内に存在します。この記事では、いくつかのデモを借用して、C#での変数宣言とスコープの関係を示します。
ケース1:変数にあいまいさが含まれている
変数スコープの原則(変数を宣言するブロックステートメントまたはメソッドの閉じ中括弧({})の前のスコープにローカル変数が存在する)によれば、最初の変数jはforループの開始前に定義されます。 scopeはMain()メソッドです。2番目の変数のスコープはforループ内にあります。最初の変数jのスコープには、2番目のjのスコープが含まれます。コンパイラーはこれら2つの変数を区別できないため、コンパイラーにはあいまいさがあり、2番目の変数を宣言することはできません。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200226bianliang
{
class Program
{
static void Main(string[] args)
{
int j = 20;//在Main中定义j为全局变量
for(int i=0; i<10; i++)
{
int j = 30;//在for循环中定义j为局部变量,但两者同为Main中,产生了包含与被包含的关系,顾报错。
Console.WriteLine(j);
}
}
}
}
ケース2:変数が「クラスレベルの変数」にアップグレードされる
C#には、変数間の基本的な違いがあります。クラスレベルで宣言された変数はフィールド(メンバー変数)と見なされ、メソッドで宣言された変数はローカル変数と見なされます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200226bianliang
{
class Program
{
public int j = 20;//在Main外声明了一个类级变量
static void Main(string[] args)
{
int j = 30;//在Main函数中定义了一个Main中的变量
Console.WriteLine(j);//执行主函数Main,打印Main中的j
return;
}
}
}
状況3:main関数でクラスレベルの変数を参照する
ケース2の場合、最初のjがpublicを介してMain関数に定義される前に、クラスレベル変数に「アップグレード」され(今回はローカル変数に属します)、クラスレベル変数の適用は次の方法で実現できます。次の方法。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200226bianliang
{
class Program
{
public int j = 20;
static void Main(string[] args)
{
int j = 30;
Console.WriteLine(j);
Program obj = new Program();//new创建对象
Console.WriteLine("类级变量是:" + obj.j);//调用方法,引用类级变量j
return;
}
}
}
状況4:静的宣言によりクラスレベルの変数が導入される
フィールドを静的として宣言することを選択した場合、呼び出し時にクラスレベルの変数を直接導入できます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _20200226bianliang
{
class Program
{
static int j = 20;//static声明
static void Main(string[] args)
{
int j = 30;
Console.WriteLine(j);
//Program obj = new Program();
Console.WriteLine("类级变量是:" + Program.j);//可直接调用
return;
}
}
}