2009-04-21 8 views
17

プロパティを作るのC#シンタックスシュガーの道の間にいくつかの内部の違いがあります:C#で読み込み専用のパブリック変数を使用することはできますか?

public string FirstName { get; set; } 

、ちょうどこのようなパブリック変数作る:私は最初の方法が好ましく、2番目されているとし

public string LastName; 

は、避けてください。

public readonly string InternalCode; 

は、読み取り専用プロパティを作成するには、このAベストプラクティスの方法です。しかし、私は多くの場合、読み取り専用プロパティのこのタイプは、上述した第2のタイプの形態である使用されて参照してください?

using System; 

namespace TestProps 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Customer customer = new Customer(); 
      customer.FirstName = "Jim"; 
      customer.LastName = "Smith"; 
      customer.Show(); 
     } 
    } 

    class Customer 
    { 
     public string FirstName { get; set; } //prefered 
     public string LastName; //avoid 
     public readonly string InternalCode; //??? 

     public Customer() 
     { 
      InternalCode = "234729834723984"; 
     } 

     public void Show() 
     { 
      Console.WriteLine("{0}, {1} ({2})", LastName, FirstName, InternalCode); 
      Console.ReadLine(); 
     } 
    } 
} 

答えて

17

彼は(まだ)答えていないと、誰もまだこれを参照しないので:

:深で彼の本 のC#を修正ジョンスキートすることにより、このトピックに関する素晴らしい記事は(ジョンにクレジットを与える)があります

Why Properties Matter

+0

その記事は私の質問に直接2ページ対応しました、ありがとう!私はそれから、ジョンは "公開読んだばかりのブールIsValid;"最後に言及しているように、ネストされたクラスに入っていない限り、 –

+1

長い記事ではなく答えを探している人には、スポイラーアラートを追加して、イエスかノー答えを与えることができますか? – DOK

+0

Skeetの記事は、実際には2つの例外を作成しますが、そのうちの1つはこの質問に適用できます。記事によると、 "私はstring.Emptyのような静的な読み取り専用フィールドの小さな例外を作成します"。この質問は変更されている可能性があり、コンストラクタから同じ行に代入を移動すると、public static readonly string InternalCode = "234729834723984";このように、Skeetと同様に「静的な読み取り専用フィールド」になります。 – John

1

はい。パブリックreadonly変数を持つことはOKです(定義やコンストラクタのときに初期化できるだけです)。

Decimal.MaxValue

公開されたreadonlyプロパティを持つことは、バッキング値が変更された場合(初期化されたものを除く)、良好です。

Environment.TickCount

私はEnvironment.NewLineがpublic readonly変数になると考えました。まあ、それは公共の財産(取得のみ)と理由は、異なるプラットフォーム間で互換性を維持することができる可能性があります。

+0

この問題は何ですか?ダウン投票の理由を記入してください。私の間違いを認識するのに役立ちます。ありがとう。 – shahkalpesh

+0

私からの投票はありませんが、Decimal.MaxValueはconstであり、インスタンスフィールドではありません(フィールドを公開しない理由でJon Skeetの記事を読んでください) –

3

プロパティを使用すると、将来の変更に耐えられるインターフェイスが提供されます。将来的には、内部コードに接頭辞を追加することが決定されるとしましょう。

public readonly変数を使用すると、内部構造が公開されるため、クラスの内部変数を使用したすべての行にプレフィックスを追加するのが難しくなります。

プロパティを使用して、あなただけの次

public string InternalCode { 
    get { return _prefix + _internalCode; } 
} 

を書くことができるとすれば完了です!

+0

すべてのコンパイラエラーを解決したら: –

+0

コンパイラのエラー? –

+0

エラー 'readonly'という修飾語はこの項目には無効です –

3

私の意見では、パブリックフィールドを公開することは大丈夫です(特に、読み取り専用またはconstの場合)。あなたがプレゼンテーションしている例では、フィールドに2つの利点があるので、おそらくプロパティを使うといいでしょう:1)カプセル化が改善され、将来、2)データバインディングを行っている場合は、プロパティが必要です。

0

短い答え:公共のconstは必ずしも、公共得ることはありませneccessarily設定せずに[OK]を、公共の読み取り専用です。 割り当てなくても変更できないオブジェクトはOKです。参照型は変更できない場合でも、値を変更できるので危険です。

readonlyキーワードの問題は、論理的に読み取り専用/不変であると理解しているとは限りません。これは「コンストラクタでのみ割り当てることができる」のようになります。参照は変更できませんが、その値は変更できます。残念ながら、c#が提供する "本当の"読み上げキーワードはありません。関連項目https://blogs.msdn.microsoft.com/ericlippert/2007/11/13/immutability-in-c-part-one-kinds-of-immutability/

プロパティには、readonlyキーワード(https://titombo.wordpress.com/2012/11/11/using-the-c-modifiers/)を使用できません。 他の人が指摘しているように、プロパティを使用して、getおよびno setのみを定義することはできますが、コンストラクタでそのプロパティを設定することはできません。プライベートセットを使用すると、クラス内のannywhereのプロパティを設定することができます。はコンストラクタ内でのみではありません。 readonlyフィールドは少し制限があります。

関連する問題