Frage

Wenn in einer Klasse, die Sie über einen privaten fiels haben und auf einer öffentlichen Eigenschaft dieses Feld aussetzen, was soll ich verwenden aus dem Inneren der Klasse?

Im Folgenden finden Sie ein Beispiel auf, was ich, um herauszufinden versuchen. Sollte manioulate privaten Bereich _Counter oder das Objekt Counter?

Public Class Test

Private _Counter As Integer

Public Property Counter() As Integer
    Get
        Return _Counter
    End Get
    Set(ByVal value As Integer)
        _Counter = value
    End Set
End Property

Private Sub Dosomething()

    'What is the best practice?
    'Direct access to private field or property?

    'On SET
    _Counter += 1
    'OR
    Me.Counter += 1

    'On Get
    Console.WriteLine(_Counter)
    Console.WriteLine(Me.Counter)

End Sub

End Class

Vielen Dank im Voraus für die Hilfe. Edu

War es hilfreich?

Lösung

Meiner Meinung nach ist einen öffentlichen Zugriff verwendet werden intern über-Verkapselung: den Code verwischt. Mit einem solchen Ansatz, sonst einfache Operationen aufrufen Accessoren, die komplexere Logik enthalten kann, so ist es schwieriger, den Code der Operationen zu analysieren.

In meiner Programmiererfahrung habe ich habe selten eine Situation, wenn es viel helfen würde. Stattdessen ziehe ich Felder direkt zugreifen zu können, und nur, wenn es wirklich benötigt wird, zu abstrahieren, den Zugang durch die Schaffung einen privaten Accessor, die sowohl von der öffentlichen Accessor und anderen Zwecke verwendet werden können. Der Grund ist, dass, wenn Sie eine spezielle Logik im öffentlichen Accessor befestigen müssen, stehen die Chancen, dass die Logik nicht das gleiche für den internen Zugriff sein kann.

Beachten Sie auch, dass die meisten modernen IDEs (wie Eclipse) erlauben sofort alle Verweise auf einem privaten Feld zu sehen, und den Code Refactoring eine Funktion anstelle einer direkten Zugriff zu verwenden.

Andere Tipps

IMO sollten Sie die Eigenschaftenaccessor werden mit , wenn möglich. Dies liegt daran, dass Sie keine Sorgen zu machen über alle interne Logik , die verfügbar sein könnten, wenn Sie eine Unterkunft haben.

Ein gutes Beispiel, wo dies geschieht, ist in der Code-behind in einer Linq Datacontext.

check this out ...

[Column(Storage="_ReviewType", DbType="TinyInt NOT NULL")]
public byte ReviewType
{
    get
    {
        return this._ReviewType;
    }
    set
    {
        if ((this._ReviewType != value))
        {
            this.OnReviewTypeChanging(value);
            this.SendPropertyChanging();
            this._ReviewType = value;
            this.SendPropertyChanged("ReviewType");
            this.OnReviewTypeChanged();
        }
    }
}

Beachten Sie all diese Logik in dem 'Setter'?

Dies ist, warum es wichtig ist, zu starten in die Praxis bekommen Ihre Eigenschaften statt Bereichen aufrufen, IMO.

Vielen Dank für die Antworten und Anregungen.

Nach Prüfung aller Vorschläge hier sowie weitere Forschungen ist es mein Eindruck, dass für diese Situation auf Privat Feld gegen Assessor es eher eine persönliche Wahl ist. Also im Grunde das wichtigste ist, dass egal, was Sie wählen, in Einklang steht.

Das heißt; meine persönliche Regel in diese Richtung lehnen:

  1. Zugriff auf Ihre privaten Felder direkt an.

  2. Wenn Zugriff auf Accessoren das Stichwort ME verwenden. zur Verbesserung der Lesbarkeit

  3. den Accessor Verwenden Sie nur, wenn es von entscheidender Bedeutung Logik Logik implementiert, die auf einen privaten Zugang gilt auch. Auf diese Weise wissen Sie, dass, wenn Sie mit dem Accessor es ist, weil es „etwas anderes, um es“

  4. Vermeiden Protected Felder verwenden. Abgeleitete Klassen sollten immer die Accessor, niemals den direkten Zugriff auf das Feld.

Lassen Sie mich wissen, was Sie denken.

Sidenote:

Danach denke ich, dass wir einen neuen Bereich für die Klassenstufe Felder fehlen. Ein Stichwort wie „Restricted“, wo dieses Feld nur von seinem Getter / Setter zugegriffen werden konnte. Auf diese Weise gelangen Sie immer direkt auf die privaten Felder, aber wenn Sie sicher, dass bestimmte Feld vornehmen müssen nur durch seine Accessor zugegriffen werden, dass Sie die Privat zu Restricted ändern. (Wie etwa "Eingeschränkt, RestrictedRead und RestrictedWrite"?)

Ich ziehe es die Eigenschaft, wann immer möglich zu verwenden. Dies gibt Ihnen die Flexibilität in der Zukunft, ohne durch zu gehen, was die Eigenschaft gibt / Sätze zu ändern und alle Orte zu finden, die die privaten Variable verwendet hat.

in dem Setter

auf den privaten Bereich verwenden, weil Sie nicht in etwas Bestimmtes tun.

Ich würde auch empfehlen, die Eigenschaft-Setter zu entfernen, auf diese Weise Sie den Zustand des Zählers zwingen, durch die gegebene Methode DoSomething () eingestellt werden

Je nach Situation kann es vorteilhaft sein, die direkte Modifizierung eines Feldes auf einer Klasse zu ermöglichen, nur privat, und oder durch eine Methode, die Semantik mit der Modifikation zuordnet. Auf diese Weise wird es leichter, über diese Klasse an der Vernunft und der jeweiligen Wert, da können Sie sicher sein, dass seine nur in einer bestimmten Art und Weise modifiziert werden. Darüber hinaus an einem gewissen Punkt, eine Aktion wie Erhöhen und int kann zusätzliche hat erforderliche Konsequenzen an welcher Stelle es mehr Sinn, den Zugang durch Methoden, um es zu belichten macht.

I immer die Eigenschaftenaccessoren verwenden, weil das mir sicher ist, falls ich Logik in dem Getter oder Setter in Zukunft hinzufügen, sicher zu wissen, dass kein Code es umgeht.

Wenn Sie sich Sorgen um die Performance-Overhead sind Accessoren der Aufruf Eigenschaft, wenn sie gehen Sie einfach direkt auf dem Spielfeld, nicht. Die meisten Compiler wird diese Art der Sache inline, Sie effektiv die gleiche Leistung. Immerhin bist du ziemlich unwahrscheinlich, dass die zusätzliche Nanosekunden Zeit Sie benötigen Verstärkung durch direkt auf das Feld gehen.

Es ist besser, mit Eigenschaftenaccessoren zu bleiben, weil a) Sie in all Ihren Code sehr konsistent sein kann, die es mehr maintainble und b) macht bekommen Sie die Vorteile hier von anderen darauf hingewiesen wird.

Auch ich nicht hinzufügen, in der Regel die Me. (oder this.) Schlüsselwörter, es sei denn es einen Umfang Problem ist (was ich durch die Wahl meiner Identifikatoren sorgfältig zu vermeiden versuchen). Ich erhalte dadurch nicht verwirrt, weil meine Funktionen und Subs sind nie so lange, dass ich nicht sicher bin, ob ich mit einem lokalen (Stack-basierten) Variable oder einem Mitglied der Klasse arbeite. Wenn sie zu lang leicht zu sagen, Refactoring ich.

Original Plakat ist genau richtig.

1) Zugriff auf Ihre privaten Felder direkt.

  • Makes Refactoring einfacher.

2) Wenn Zugriff auf Accessoren verwenden Sie das Schlüsselwort ME. zur Verbesserung der Lesbarkeit

  • expliziter Auflistung Umfang erfordert weniger Denken durch Leser

3) Verwenden Sie die Accessor nur, wenn es von entscheidender Bedeutung Logik Logik implementiert, die auf einen privaten Zugang gilt auch. Auf diese Weise wissen Sie, dass, wenn Sie mit dem Accessor es ist, weil es „etwas anderes, um es“

  • das ist der einzige Grund, warum Regel # 1 zu verletzen.

4) Vermeiden Sie Protected Felder verwenden. Abgeleitete Klassen sollten immer die Accessor, niemals den direkten Zugriff auf das Feld.

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