2011-09-15 15 views
13

こんにちは、下の2つのコードの間に違いはありますか?または、トップは、ボトムワンの短い形式ですか?小包と完全な財産の違いは何ですか?

public string Name{get;set;} 

private string _Name; 
     public string Name 
     { 
      get { return _Name; } 
      set { _Name=value; } 
     } 
+0

自動プロパティのMSDN記事「...コンパイラは、プロパティのgetおよびsetアクセサを使用してのみアクセスできるプライベートの匿名のバッキングフィールドを作成します」 - http://msdn.microsoft.com/en- us/library/bb384054.aspx –

答えて

9

唯一の違いは、クラスのコンストラクタで "Default Name"を使用して初期化を行う必要があるという点を除いて、_Nameがクラス自体内で表示されるということです。クラスはNameではなく_Nameを内部的に参照する危険性があり、すべて正常に動作し、クラス内で_Nameを使用しているため呼び出されないNameにいくつかのロジックを追加します。

例:それらは、完全に同等である書かれたように、例えば

1

は、それは単に短い形式は、基本的な変数は、まだ(データは、保存されている)をサポートするバッキングフィールドとして生成されますが、自動的に - これはあなたがある場合に便利です文字通りちょうど取得して設定し、いずれかのアクセッサで特定の実装の詳細を必要としません。

3

私は、コンパイルされたコードに違いがあるとは思わない。あなたがデフォルトの値を追加したい場合(コンストラクタで短縮形で行うこともできます)、またはゲッターまたはセッターにコードを追加する場合は、

EDIT:実際には、あなたのコードは、それが両方とも同等であり、第2の形態のこの特定の実装のために

private string _Name; 
public string Name 
{ 
    get { return _Name; } 
    set { _Name = value; }//change here 
} 

ない...

value = _Name; 
1

でなければなりません間違っています。なぜなら、最初のフォームを書くだけなら、コンパイラはほぼ同じコードを生成するからです。

public string Name{get;set;} 

が、それは次のようになり作る::ところで

private string generatedCode_Name; 
public string Name 
{ 
     get { return generatedCode_Name; } 
     set { generatedCode_Name = value; } 
} 

、これは

set { value = _Name; } //I believe its a typo! 
間違っている、コンパイラはそれにコードを追加しようとしているされて

私はあなたが意味すると思う:

set { _Name = value; } 
1

1つの違いは、あなたが一度あなたが同じであった2つの例をコンパイルし、この

private string _Name = "Default Name"; 
public string Name 
{ 
    get { return _Name; } 
    set { value = _Name; } 
} 

を行うときに、プライベート文字列にデフォルト値を設定することができるということです。

0
private string _Name = "Default Name"; 
public string Name 
{ 
    get { return _Name.Left(42); } // Changed the getter 
    set { _Name = value; } 
} 

void MyOtherMethod() 
{ 
    string foo = _Name; // Referencing the private field accidentally instead of the public property. 
    // Do something with foo 
} 

Auto-implemented propertiesは、ゲッター/セッターに余分なロジックを持たずに、パブリックフィールドを避けるためだけにプロパティが使用されるような、これらのタイプの状況に正確に対応するために導入されたシンタックスシュガーです。ただし、自動実装されたプロパティは、メタデータなどのプロパティの利点をすべて提供します。むしろそれらについてもう少し詳しく説明するold but still relevant linkがあります。

背後では、コンパイラは自分のものと非常によく似たバッキングフィールドを生成します。

3

プロパティメソッドの両方の基本的な動作と目的はほぼ同じです。しかし、大きな違いは実装にあります。

public string Name{get;set;} 

private string _Name; 
     public string Name 
     { 
      get { return _Name; } 
      set { _Name=value; } 
     } 

の違いは、あなたが(フレームワーク3.0以降に導入された)短いプロパティの構文を使用する場合は、直接「名前」プロパティを使用している場合、そのプロパティ刺さがすなわち初期化されることはありませんですどこに値を設定しなくても、NULL値を返します。しかし、2番目の構文を使用してプロパティ値を初期化すると、文字列を初期化するときにNULLではなくEMPTY値で初期化されるため、EMPTY文字列が返されます。そのため、FULLプロパティメソッドを使用して初期化せずにプロパティ値を返すと、常にNULL値ではなくEMPTY文字列が返されます。

関連する問題