2016-12-31 9 views
4

私は次のことを理解していません: 以下のコードでは、コンストラクタの2番目のthisキーワードを削除してコードを単純化できることをVisual Studioに教えてくれます。c#以下のコンストラクタの2つのキーワードの違いは何ですか?

しかし、最初にthisというキーワードを削除できないのはなぜですか? 両方の変数がコンストラクタの外部でクラス内で宣言されていたため、両方の変数がインスタンスに対して "オーバーライド"されます。

thisのキーワードを両方とも削除すると、VSは最初の割り当てが同じ変数に行われたものの、2番目の割り当ては行われないと不平を言います。 私にとって唯一の明白な違いは、2番目の変数は配列ですが、どのように違いがあるのか​​分かりません。

*ここでは上書きが正しい用語ではないと思われます。コンストラクタ内、識別子celestialBodyCountはそうあなたがthisとそれを修飾する必要がフィールドにアクセスするには、パラメータを参照することを意味します -

public class CelestialObject { 

    CelestialBody[] celestialBodies; 
    int celestialBodyCount; 

    public CelestialObject(int celestialBodyCount = 2) { 
     this.celestialBodyCount = celestialBodyCount; 
     this.celestialBodies = new CelestialBody[celestialBodyCount]; 
    } 
} 
+0

クラスレベルとメソッド本体の両方に 'celestialBodyCount'があるためです。クラスレベルを参照するように 'this'を書いてください。 'this'を書いていなければ、まずメソッドの範囲を調べます。何も見つからなければ、クラスレベルで価値を探します。 –

+0

より良い命名規則は、この '_celestialBodies'のように先頭にアンダースコアを持つフィールドを書くことです。これはresharperが示唆し、私はいつもそれを行うものです。大会では、このようなフィールドに名前を付けます。引数とローカル変数はアンダースコアなしで名前が付けられます。したがって、 'this'を書く必要はありません。 –

+0

ありがとう、命名規則といくつかのスタイルポリシングthingieを調べます。 – Balinth

答えて

5

あなたのフィールドcelestialBodyCountと同じ名前のパラメータを持っているので、あなたが最初のthisキーワードを廃止することはできません。

int celestialBodyCount; // The field 

そして

public CelestialObject(int celestialBodyCount = 2) { // The parameter. 

thisキーワードがあることを示すために必要とされますフィールドが割り当てられています。 3.7.1 Name hidingで説明したようにそれ以外の場合は、パラメータは、フィールドよりも優先されます:

...実体の範囲は、同じ名前のエンティティを含む新しい宣言空間を紹介する宣言を含んでいてもよいです。このような宣言は元のエンティティを隠すようにします。

そして3.7.1.1 Hiding through nesting:ネストを通して隠蔽

名前クラスまたは構造体、およびAS内の入れ子型の結果として、入れ子の名前空間または名前空間内の型の結果として起こり得ますパラメータとローカル変数宣言の結果この場合

パラメータcelestialBodyCount部材celestialBodyCountを隠し。

もちろん

、あなたがthisにコンパイラを削除を行う場合は、親切にあなたの次の警告を与える:

Assignment made to same variable; did you mean to assign something else? 

この警告は、ほとんど常にバグを示し、常にクリーンアップする必要があります。このコードで

3

違いは、あなたがcelestialBodyCountというパラメータを持っていることです。

celestialBodiesというパラメータ(または他のローカル変数)がないため、識別子は必須ではなく、フィールドを参照しています。

+1

また、多くのバグが表示される可能性のあるこの機能に対して「ありがとう」を追加することもできます –

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の場合、混乱はありません。1つしか存在しないため、thisの有無にかかわらず動作します。

+1

正確には、コンパイラは質問しません。 – InBetween

関連する問題