2011-01-02 9 views
3

私は、プライベートクラスのインスタンスをstream.BeginRead操作に提供される状態オブジェクトとして使用しています。 (クラスは私のメインストリームの読み書きクラスにはプライベートです。)プライベートクラスはプロパティによってアクセスする必要がありますか?

public class MainClass 
{ 
    // ... 

    private class ResponseState 
    { 
     public IResponse response; 
     public Stream stream; 
     public byte[] buffer = new byte[1024]; 
    } 
} 

クラスへのアクセスは、直接フィールドを介して行われます。私は本当にこの状態でプロパティを介してクラスへのアクセスを提供する必要があります、それは状態を保持するためだけに使用されていますか?

他人のことを知りたい。

+0

すべての回答に感謝します。残念ながら、私は1つだけを選ぶことができます、そして私はアンドリューの答えを選んだ。 – Andy

答えて

2

私は、クラス内だけでなくクラス外でもカプセル化が役に立ちます。よく知られているインターフェース(つまりプロパティ)を介してメンバーへのすべてのアクセスを集めることで、呼び出しコードを変更することなく後でそのアクセスの周りにロジックを追加する柔軟性が得られます。

自動的に実装されたプロパティを指定すると、残念なことですが、自動的に実装されたプロパティを指定すると、プロパティを宣言することが容易になり、柔軟性を最大限に引き出すためにプロパティを宣言することができます。

5

C#言語では必須ではありませんが、保守上の理由からフィールドを直接公開することは絶対に避けてください。代わりにプロパティを使用することをお勧めします。

StyleCop SA1401:FieldsMustBePrivateを参照してください。

型名 - FieldsMustBePrivate
CheckId - SA1401
カテゴリー - 保守ルール

原因

C#クラス内のフィールドは、プライベート以外のアクセス修飾子を持っています。

ルール説明

クラスのフィールドが非プライベートのアクセス権を与えられているときには、このルールの違反が発生します。メンテナンス上の理由から、プロパティは常にクラス外のフィールドを公開するメカニズムとして使用する必要があり、フィールドは常にプライベートアクセスで宣言する必要があります。これにより、クラスのインタフェースを変更することなく、プロパティの内部実装を時間の経過とともに変更することができます。

C#の構造体内にあるフィールドには、任意のアクセスレベルが設定できます。 、このルールの違反を修正するフィールドをプライベートにして、クラスの外のフィールドを公開するプロパティを追加するには違反

を修正する方法

あなたのクラスが含まれているクラスの純粋な状態であれば、それを使用するクラスの中に直接メンバーを配置することを検討できます。あなたのクラスが単なる状態以上のものであれば、それは通常の保守性のルールに従うべきです。

+0

+1 stylecopの参照用です。 –

1

私の組織では、クラスがプライベートか内部かを問わず、エンティティクラスであれば、パブリックフィールドを使用してアクセスしました。

しかし、C#3以降。0の場合はautomatic propertiesを使用するため、プロパティを使用してプライベートフィールドにアクセスします。

とにかく、効果は同じです。私たちの場合は、コードを読みやすくすることでした。

0

ベストプラクティスは、他のタイプでアクセス可能なすべてのメンバーにプロパティを使用することです。 C#3.0の自動プロパティはこれを非常に簡単にします。

0

私はこの1〜2週間前に何度か読んだことがあります。 2つのキャンプがあります。私の先生はそう言って、誰もがそれをしているので大部分の人は財産を包み込む必要があると言います。彼らは、不動産に余分なロジックを追加したり、保守性を高めたり、その他の弱い理由を付ける方が簡単だと言います。他のキャンプは、あなたがあなたがそれを間違ってやっているすべてでプロパティを使うならば、(実際のいくつかの例外を除いて)ラインに沿っている傾向があります。私の言う限りあなたの場合は例外になります。実際には、それについて考えると、彼らはおそらくあなたがそれを間違っていると言うだろう:)ただ勝つことはできません。とにかく、セッターやゲッタに余分なロジックが必要な場合を除いて、ラッピングを気にしないで使ってみようとしています。なぜあなたのプログラムは遅くならないのですか? (明らかに彼らはどれほど遅いかを測定することができます)。

私は多くのMVVMを行い、それらを必要とするINotifyPropertyChangedを実装する必要があるため、フィールドよりプロパティを使用する傾向があります。あなたのケースでは、私はプロパティでそれらをラップすることについて心配しないでください無意味な脂肪のためだけになります。しかし、それがプロパティを必要とするクラスにあった場合、私はそれらのクラスで同様のものを保つためにそれらをラップします。

あなたがResharperを持っている場合は、それらをラップしておらず、後で必要な場合は右クリックのrefactor-> encapsulateフィールドでプロパティをラップします。

関連する問題