C#中构造函数内与类内同名变量为何被判定为不同变量?
核心规则解答
关于嵌套作用域的遮蔽规则
C#采用层级作用域设计,子作用域可以声明和外层作用域同名的变量,此时子作用域内的同名变量会遮蔽外层变量,默认优先指向当前作用域的新变量。你代码里类级别声明的public int i =5是类成员字段,作用域属于类层级;构造函数内声明的int i=2是构造函数的局部变量,属于类作用域下的嵌套子作用域,二者属于不同作用域的两个独立变量,因此不会冲突。
如果需要在构造函数内访问被遮蔽的类成员字段,使用this.i即可指向类层级的成员变量。关于重复声明的判定规则
C#仅禁止同一作用域内的同名变量重复声明,不同层级的嵌套作用域不受该限制:- 如果你在构造函数内部连续两次声明
int i,属于同一作用域重复声明,编译器会直接报错。 - 类成员字段和构造函数局部变量属于不同层级作用域,不属于重复声明,因此编译器允许。
- 如果你在构造函数内部连续两次声明
代码运行结果说明
你提供的代码执行逻辑如下:
using System; namespace Modifier { public class weird { // 类级别成员字段i,初始值5 public int i = 5; public weird() { // 构造函数作用域局部变量i,初始值2,遮蔽外层类成员i int i = 2; // 输出当前作用域的局部变量i:2 Console.WriteLine("Variable inside the constructor: "+i); } public void display() { // 该方法内没有声明同名局部变量,直接访问类成员字段i:5 Console.WriteLine("Result:"+i); } } class Program { static void Main(string[] args) { var example = new weird(); // 调用构造函数,第一行输出2 example.display(); // 调用display方法,第二行输出5 } } }
运行输出为:
Variable inside the constructor: 2 Result:5
内容的提问来源于stack exchange,提问作者Vishnu Suvarnan
相关产品推荐
相关产品推荐

