局部变量实例化
当执行过程进入局部变量范围时,该变量视为被实例化。例如当调用下面方法时局部变量x被实例化和初始化三次,每一次对应于循环的一轮迭代。
static D[] F()
{
for (int i = 0; i < 3; i++)
{
int x = 2 * i + 1;//当x声明在循环里面,结果为1,3,5
...
}
但是,如果将x声明移到循环外,则x将只实例化一次。
static D[] F()
{
int x;
for (int i = 0; i < 3; i++)
{
x = 2 * i + 1;//当x在循环外声明结果为5,5,5
}
为捕获时,我们无法确切的知道局部实例化的频率,因为实例化的生存期不是连续的,有可能每次实例化都使用同一位置存储,但是,当用匿名函数捕获到局部变量时,实例化的效果就变得很明显了,下面示例
using System;
namespace 委托
{
class Program
{
public delegate void D();
static void Main(string[] args)
{
foreach (D d in F())
d();
Console.ReadKey();
}
static D[] F()
{
D[] result=new D[3];
//int x;
for (int i = 0; i < 3; i++)
{
int x = 2 * i + 1;//当x声明在循环里面,结果为1,3,5
//x = 2 * i + 1;//当x在循环外声明结果为5,5,5
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
}
}
但是如果for循环声明了一个迭代变量,则该变量视为在循环外部声明。
static D[] F()
{
D[] result=new D[3];
for (int i = 0; i < 3; i++)
{
result[i] = () => { Console.WriteLine(x); };
}
return result;
}
输出的结果将为3,3,3