プライベートクラスにプロパティからアクセスする必要がありますか?

StackOverflow https://stackoverflow.com/questions/4578631

質問

私は、Stream.begined操作に供給された状態オブジェクトとしてプライベートクラスのインスタンスを使用しています。 (クラスは私のメインストリームリーディング/ライティングクラスのプライベートです。)

public class MainClass
{
    // ...

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

クラスへのアクセスは、直接フィールドを介して行われます。この場合、この場合はプロパティを介してクラスへのアクセスを提供する必要があります。

他の人が何をしているのかを知りたい。

役に立ちましたか?

解決

私はそうするだろう - カプセル化はクラス内およびクラスの外側でも役立ちます。よく知っているインターフェイス(つまり、プロパティ)を介してメンバーへのすべてのアクセスをファンネル化することにより、あなたは自分自身に呼び出しコードを変更せずにそのアクセスの周りにロジックを追加する柔軟性を与えています。

それはやり過ぎのように思えるかもしれませんが、正直なところ、自動的に実装されたプロパティを考えると、プロパティを宣言するのは非常に簡単であるため、先に進み、最大限の柔軟性を与えるために使用することができます。

他のヒント

C#言語では必須ではありませんが、保守性の理由でフィールドを直接公開しないことは良い習慣です。代わりにプロパティを使用することがお勧めします。

見る Stylecop SA1401: :fieldsmustbeprivate。

TypeName -fieldsmustbeprivate
CheckId -SA1401
カテゴリ - 保守性ルール

原因

C#クラス内のフィールドには、プライベート以外のアクセス修飾子があります。

ルールの説明

この規則の違反は、クラス内のフィールドに非プライベートアクセスが与えられるたびに発生します。保守性の理由から、プロパティは常にクラス外のフィールドを露出させるメカニズムとして使用する必要があり、フィールドは常にプライベートアクセスで宣言する必要があります。これにより、クラスのインターフェースを変更せずに、プロパティの内部実装が時間の経過とともに変更されます。

C#構造体内にあるフィールドは、アクセスレベルを持つことができます。

違反を修正する方法

このルールの違反を修正するには、フィールドをプライベートにし、クラス外のフィールドを公開するプロパティを追加します。

クラスが含まれているクラスの純粋に述べられている場合は、メンバーを使用するクラスの内側に直接配置することを検討できます。あなたのクラスが単なる状態以上のものである場合(そして私はそれがそうであると思われます)、それは通常の保守性ルールに従うべきです。

私の組織では、クラスがプライベートまたは内部であり、それがエンティティクラスであるとき、私たちはそれにアクセスするためにパブリックフィールドを使用しました。

ただし、C#3.0以降は使用しています 自動プロパティ, 、そのため、常にプロパティを使用してプライベートフィールドにアクセスします。

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

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

私は1、2週間前にこれについて読んでいます。 2つのキャンプがあります。私の先生がそう言ったので、大多数はあなたが財産に包みなければならないと言っています。彼らは、それがプロパティに追加のロジックを追加しやすい、またはより保守可能な他のいくつかの弱い理由を追加するのが簡単だと言います。他のキャンプは、自分自身を「真のooの男」と呼ぶ傾向があります。もしあなたが間違っていることをすべて使用している場合(もちろんいくつかの例外を除いて)、その境界線に沿っている傾向があります。私が知る限り、あなたのケースは例外です。実際、それについて考えて、彼らはおそらくあなたがそれを間違っていると言うでしょう:)勝つことはできません。とにかく、彼らはまた、あなたがそれらを使用するつもりなら、あなたがあなたのセッターとゲッターに追加のロジックが必要でない限り、包むことを気にしないでくださいと言います。なぜあなたのプログラムを無駄に減速させるのか。 (どうやら彼らもどれだけ遅いかを測定できます)。

私は多くのMVVMを実行しているため、フィールドでプロパティを使用する傾向があり、それらを必要とするInotifyPropertyChangedを実装する必要があります。あなたの場合、私はそれらを特性に包むことを心配することはありません。しかし、それがプロパティを必要とするクラスにあった場合、私はそれらをそのクラスで似たようなものにするためにそれらを包みます。

結局のところ、それらをラップしなかった場合、後で必要な場合は、右クリックのリファクタル - > cencapsulate fore fore fore sharperがある場合はプロパティをラップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top