Frage

Ich verwende eine Instanz einer privaten Klasse als staatlich an einem Stream.BeginRead -Operation gelieferte Zustandsobjekt. (Die Klasse ist privat für meinen Hauptstream -Les-/Schreibklasse.)

public class MainClass
{
    // ...

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

Der Zugriff auf die Klasse erfolgt direkt über die Felder. Sollte ich in diesem Fall wirklich Zugang zur Klasse über Immobilien gewähren, auch wenn sie nur zum Halten des Zustands verwendet werden soll?

Interessiert zu wissen, was andere tun.

War es hilfreich?

Lösung

Ich würde - die Kapselung ist sowohl innerhalb der Klasse als auch außerhalb der Klasse nützlich. Indem Sie den gesamten Zugriff auf ein Mitglied über eine gut kennengelernte Schnittstelle (dh die Eigenschaft) übertragen, geben Sie sich die Flexibilität, später Logik um diesen Zugriff hinzuzufügen, ohne den Anrufcode zu ändern.

Es mag wie Overkill erscheinen, aber ehrlich gesagt ist es so einfach, eine Eigenschaft zu deklarieren, dass Sie sich genauso gut mit einer maximalen Flexibilität befassen können.

Andere Tipps

Die C# -Sprache ist nicht erforderlich, aber es ist eine gute Praxis, ein Feld aus Wartbarkeitsgründen niemals direkt aufzudecken - es wird vorgeschlagen, stattdessen eine Eigenschaft zu verwenden.

Sehen Stylecop SA1401: FieldsMustbeprivate.

Typename - FieldsMustbeprivate
CheckID - SA1401
Kategorie - Wartbarkeitsregeln

Weil

Ein Feld innerhalb einer C# -Klasse verfügt über einen anderen Zugangsmodifikator als privat.

Regelbeschreibung

Ein Verstoß gegen diese Regel erfolgt immer dann, wenn ein Feld in einer Klasse nicht private Zugriff erhält. Aus Gründen der Wartbarkeit sollten Immobilien immer als Mechanismus für die Freigabe von Feldern außerhalb einer Klasse verwendet werden, und Felder sollten immer mit privatem Zugang deklariert werden. Dies ermöglicht die interne Implementierung der Eigenschaft im Laufe der Zeit, ohne die Schnittstelle der Klasse zu ändern.

Felder innerhalb von C# Strukturen dürfen einen Zugangsniveau haben.

So reparieren Sie Verstöße

Machen Sie das Feld privat und fügen Sie eine Eigenschaft hinzu, um das Feld außerhalb der Klasse freizulegen.

Wenn Ihre Klasse nur für die enthaltende Klasse angegeben ist, können Sie die Mitglieder direkt in die Klasse platzieren, die sie verwendet. Wenn Ihre Klasse mehr als nur angibt (und ich vermute, dass dies der Fall ist), sollte sie den üblichen Vorstandsregeln folgen.

In meiner Organisation haben wir, wenn eine Klasse privat oder intern war und eine Entitätsklasse war, öffentliche Felder verwendet, um darauf zuzugreifen.

Seit C# 3.0 verwenden wir jedoch automatische Eigenschaften, Daher verwenden wir immer Eigenschaften, um auf private Felder zuzugreifen.

Wie auch immer, der Effekt ist der gleiche, in unserem Fall war es, den Code lesbarer zu machen.

Best Practice besteht darin, Eigenschaften für jedes Mitglied zu verwenden, das von anderen Typen zugänglich ist. Automatische Eigenschaften bei C# 3.0 machen dies ganz einfach.

Ich habe gerade vor ein oder zwei Wochen etwas gelesen. Es gibt die beiden Lager. Einer der Mehrheit sagt, Sie müssen das Grundstück einwickeln, weil mein Lehrer dies gesagt hat und alle anderen es tun. Sie sagen, dass es einfacher ist, einer Eigenschaft eine zusätzliche Logik zu verleihen, oder mehr wartbare und andere schwache Gründe. Das andere Lager nennt sich "die wahren OO -Jungs" in der Regel, wenn Sie überhaupt Eigenschaften verwenden, dass Sie es falsch machen (mit einigen Ausnahmen natürlich). Ihr Fall wäre die Ausnahme, soweit ich das beurteilen kann. Eigentlich würden sie wahrscheinlich immer noch sagen, dass Sie es falsch machen :) Ich kann einfach nicht gewinnen. Wie auch immer, sie sagen auch, wenn Sie sie verwenden möchten, müssen Sie sich nur um einwickeln, es sei denn, Sie benötigen die zusätzliche Logik in Ihren Setzen und Gettern. Warum Ihr Programm umsonst verlangsamen? (Anscheinend können sie auch messen, wie langsam).

Ich neige dazu, Eigenschaften über Feldern zu verwenden, da ich viel MVVM mache und inotifyPropertyChanged implementieren muss, was sie erfordert. In Ihrem Fall würde ich mir keine Sorgen machen, sie in Eigenschaften einzuwickeln, nur für sinnloses Fett. Aber wenn es in einer Klasse war, die eine Eigenschaft brauchte, würde ich sie einwickeln, um die Dinge in dieser Klasse ähnlich zu halten.

Wenn Sie sie nach allem, was Sie nicht eingepackt haben, und später müssen, handelt es sich um einen rechten Klick-Refactor-> Incapsulat-Feld, um eine Eigenschaft zu wickeln, wenn Sie Resharper haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top