我不明白以下几点:
在下面的代码中,Visual Studio告诉我,我可以通过删除构造函数中的第二个this
关键字来简化我的代码。
但为什么我不能取消第一个this
关键字?
这两个变量都是在构造函数之外的类中声明的,因此两个变量都将被“覆盖”为实例。
如果我删除了两个this
个关键字,那么VS会抱怨第一个赋值是针对同一个变量,而不是针对第二个赋值。
对我来说唯一明显的区别是第二个变量是一个数组,但是我不明白它会有什么不同呢?
*我怀疑覆盖不是正确的术语。
public class CelestialObject {
CelestialBody[] celestialBodies;
int celestialBodyCount;
public CelestialObject(int celestialBodyCount = 2) {
this.celestialBodyCount = celestialBodyCount;
this.celestialBodies = new CelestialBody[celestialBodyCount];
}
}
答案 0 :(得分:5)
您无法取消使用第一个this
关键字,因为您的参数名称与字段celestialBodyCount
相同:
int celestialBodyCount; // The field
和
public CelestialObject(int celestialBodyCount = 2) { // The parameter.
需要this
关键字来表示该字段已分配给。否则,该参数优先于该字段,如 3.7.1 Name hiding 中所述:
......实体的范围可能包括引入包含同名实体的新声明空间的声明。此类声明会导致原始实体隐藏。
然后 3.7.1.1 Hiding through nesting :
由于在类或结构中嵌套类型,以及参数和局部变量声明的结果,嵌套命名空间或命名空间内的类型可能会导致通过嵌套隐藏名称。 < / p>
在这种情况下,参数celestialBodyCount
会隐藏成员celestialBodyCount
。
当然,如果您做删除this
,编译器将帮助您发出以下警告:
Assignment made to same variable; did you mean to assign something else?
此警告几乎总是表示存在错误,应始终清除。
答案 1 :(得分:3)
不同之处在于您有一个名为celestialBodyCount
的参数 - 这意味着在构造函数中,标识符celestialBodyCount
引用了参数,因此要访问该字段,您必须符合条件它与this
。
您没有名为celestialBodies
的参数(或其他本地变量),因此该标识符已经引用该字段,无需任何资格。
答案 2 :(得分:2)
在此代码中,没有this
关键字:
public CelestialObject(int celestialBodyCount = 2)
{
celestialBodyCount = celestialBodyCount;
this.celestialBodies = new CelestialBody[celestialBodyCount];
}
Visual Studio说:“我很抱歉,但没有this
关键字,参数中有celestialBodyCount
因此它将被分配给自己,因为它是具有该名称的封闭匹配变量。你确定这是你的意思吗?或者你的意思是班级领域?“ Visual Studio对您很友好,但编译器会继续将参数中的celestialBodyCount
分配给自身,并且不会将其分配给您的类级别字段。所以要感谢Visual Studio,因为编译器不会提醒你。
当您放置this.celestialBodyCount
时,Visual Studio知道您知道您正在将其分配到类级别字段。
对于this.celestialBodies
,没有混淆,只有一个存在,因此它可以使用或不使用this
。