变量具有一定的作用域,在 VBScript 中表现不明显,而在 C# 中表现格外明显。
除了函数内、类内等作用域外,{} 也可以将变量作用域隔开。
void Page_Load(object sender, EventArgs e)
{
{
string str = "123";
}
lb.Text = str; //出错
}
对于 lb.Text = str 来说,它所处的块及父块没有定义 str,它无法引用子块所定义的 str(string str = "123";),所以会出错。
void Page_Load(object sender, EventArgs e)
{
{
string str = "123";
}
{
lb.Text = str; //出错
}
}
对于 lb.Text = str 来说,它所处的块及父块没有定义 str,它无法引用兄弟块所定义的 str(string str = "123";),所以会出错。
void Page_Load(object sender, EventArgs e)
{
string str = "abc";
{
string str = "123"; //出错
}
lb.Text = str;
}
string str = "123"; 具有父块(其 {} 以外,函数以内),在父块中定义了 str(string str = "abc";),由于不能重复定义父块中的变量,所以会出错。
void Page_Load(object sender, EventArgs e)
{
{
string str = "123";
}
string str = "abc"; //出错
lb.Text = str;
}
string str = "abc"; 子块已经先于父块定义了 str(string str = "123";),由于不能重复定义子块中的变量,所以会出错。
void Page_Load(object sender, EventArgs e)
{
{
string str = "123";
}
{
string str = "abc";
}
}
两句 str 定义所处的块是兄弟关系,没有错误发生。
总结
- 子块定义 var,父块不能使用该 var,父块不能再定义 var。
- 父块定义 var,子块可以使用该 var,子块不能再定义 var。
- 兄弟块定义 var,兄弟块不能使用该 var,兄弟块可以再定义 var。
再浓缩一下
兄弟块完全隔离,子块与父块之间定义不隔离,使用上半隔离(子块可以使用父块定义的变量,父块不能使用子块定义的变量)
说明
- 以上所说的块,限定于一个函数之内,如果函数之外定义了全局变量,函数内仍可以定义局部变量。
- {} 并不一定要位于 if、for 等语句之后,可以单独存在。