c#下面的构造函数中两个this关键字的区别是什么?

时间:2016-12-31 20:56:36

标签: c# constructor this

我不明白以下几点: 在下面的代码中,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];
    }
}

3 个答案:

答案 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