Visual Studio建议删除关键位置的this关键字,编译器能否正确解析?
为什么Visual Studio建议删除对象初始化器中的
this.? 首先给你吃个定心丸:编译器完全能正确识别你要赋值的类成员变量,删除this.后代码依然会按照你的预期运行,不会出现变量遮蔽的问题。
咱们来拆解一下背后的逻辑:
C#的名字查找规则在对象初始化器的场景下有明确的优先级:等号右侧的表达式,是在当前方法的作用域里查找变量的,而不是在你正在初始化的ThisExampleClass对象的作用域里。
回到你的代码:在ShowQuestion方法里,你只定义了一个局部变量ThisTest,并没有和类成员ThisTest1/ThisTest2同名的局部变量。所以当你写ThisTest1 = ThisTest1时,编译器找不到同名的局部变量,就会自动往上查找类的成员变量——这和你写this.ThisTest1的效果完全一致。
Visual Studio建议删除this.,是因为在这种完全没有歧义的场景下,this.属于冗余代码,去掉它不会改变语义,还能让代码更简洁。
那什么时候必须加this.呢?只有当方法内存在和成员变量同名的局部变量时,才需要显式用this.来区分。比如下面这个例子:
public void ShowQuestion() { int ThisTest1 = 5; // 局部变量和类成员同名 var ThisTest = new ThisExampleClass() { ThisTest1 = ThisTest1, // 这里会赋值局部变量的5,而不是类成员的10 // 如果要引用类成员,必须写:ThisTest1 = this.ThisTest1 }; }
这种情况下,编译器会优先使用局部变量(局部作用域的优先级高于类成员作用域),这时候才需要this.来明确你要引用的是类的成员。
总结一下:
- 当方法内没有同名局部变量时,对象初始化器右侧的变量名默认指向类成员,
this.可删,VS的建议合理。 - 只有存在同名局部变量导致歧义时,才需要显式添加
this.。
内容的提问来源于stack exchange,提问作者CuNi
相关产品推荐
相关产品推荐

