Was ist der Unterschied zwischen einer Eigenschaft und einer Variablen?

78

Ich bin verwirrt über das Verständnis von Eigenschaften und Variablen

public class ABC()
{
    public int A;
    public int B { get; set; }
}

Was ist der genaue Unterschied zwischen A und B?

Vijjendra
quelle
15
Zu Ihrer Information wird Anormalerweise als Feld und nicht als Variable bezeichnet.
Brian Rasmussen

Antworten:

71

Wie viele darauf hingewiesen haben, ist A ein Feld , B eine Eigenschaft .

Die eigentliche Frage ist, warum sollte es Sie interessieren und was Sie verwenden sollten?

Ich beziehe mich auf einen Blog-Beitrag von Jonathan Aneja :

(Es ist in VB, aber es gilt auch für C #;))

Warum also Eigenschaften über Feldern verwenden, 5 Gründe:

1. Felder können nicht in Schnittstellen verwendet werden

Sie können das Vorhandensein eines Felds im öffentlichen Vertrag eines Objekts nicht über eine Schnittstelle erzwingen. Für Eigenschaften funktioniert es jedoch gut.

2. Validierung

Während Ihre Anwendung derzeit möglicherweise keine Validierungslogik zum Festlegen eines bestimmten Werts benötigt, müssen Sie diese Logik möglicherweise später einfügen, um die Geschäftsanforderungen zu ändern. Zu diesem Zeitpunkt ist das Ändern eines Felds in eine Eigenschaft eine wichtige Änderung für die Benutzer Ihrer API. (Zum Beispiel, wenn jemand Ihre Klasse durch Reflexion inspiziert hat).

3. Binäre Serialisierung

Das Ändern eines Felds in eine Eigenschaft ist eine wichtige Änderung, wenn Sie die binäre Serialisierung verwenden. Dies ist übrigens einer der Gründe, warum die automatisch implementierten Eigenschaften von VB10 ein "bindbares" Hintergrundfeld haben (dh Sie können den Namen des Hintergrundfelds im Code ausdrücken) - auf diese Weise, wenn Sie eine automatisch implementierte Eigenschaft in eine erweiterte Eigenschaft ändern Sie können die Serialisierungskompatibilität beibehalten, indem Sie den Namen des Sicherungsfelds beibehalten (in C # müssen Sie ihn ändern, da Sicherungsfelder mit nicht bindbaren Namen generiert werden).

4. Ein Großteil der .NET-Datenbindungsinfrastruktur ist an Eigenschaften gebunden, jedoch nicht an Felder

Ich habe auf beiden Seiten Argumente darüber gehört, ob das eine gute Sache ist oder nicht, aber die Realität ist, dass es im Moment so funktioniert. (Anmerkung von mir: WPF-Bindungen funktionieren für Eigenschaften)

5. Das Freilegen eines öffentlichen Feldes ist eine FxCop-Verletzung

Aus vielen der oben genannten Gründe :)

Es könnte weitere Gründe geben.

Ich möchte auch auf einen Blog-Beitrag von Jeff Atwood verweisen und mit einem Zitat daraus schließen:

Das wirklich Wichtige, was Sie hier mitnehmen sollten, ist zu vermeiden, dass Sie Code schreiben, der keine Rolle spielt. Und Property Wrapper um öffentliche Variablen sind die Essenz von bedeutungslosem Code.

Arcturus
quelle
1
Und dennoch können automatisch implementierte Eigenschaften nicht als out-Parameter verwendet werden: / yay c # zwingt uns bedeutungslosen Code auf
Assimilater
Aktualisierte Dokumentation für Element 5 - CA1051: Deklarieren Sie keine sichtbaren Instanzfelder docs.microsoft.com/en-us/visualstudio/code-quality/…
Tiago Crizanto
23

A ist ein Feld, B ist eine Eigenschaft. Eine Eigenschaft ist im Grunde syntaktischer Zucker für Getter und Setter. Die von Ihnen definierte Klasse wird wie folgt kompiliert:

public class ABC()
{
    public int A;

    private int backing_B;

    public void set_B(int value)
    {
        backing_B = value;
    }

    public int get_B()
    {
        return backing_B;
    }
}

Beachten Sie, dass diese Art der Konvertierung für alle C # -Eigenschaften gilt. Zugriffe auf ABC.B werden in Methodenaufrufe konvertiert. Eigenschaften vermitteln im Grunde die Illusion einer "Variablen", während sie eigentlich nur ein geschickt getarntes Methodenpaar sind.

Dies ist wichtig, da Sie damit Ihren eigenen get- und set-Methodenkörper deklarieren können, der Werte validieren oder andere interessante Dinge tun kann:

private int b;

public int B {
    get { return b; }
    set {
        if (value < 0) throw new ArgumentOutOfRangeException("value");
        b = value;
    }
}

Beachten Sie, dass die meisten Eigenschaften ein Feld zum Speichern ihres Werts verwenden. Eigenschaften existieren selten alleine, abgesehen von Feldern.

cdhowie
quelle
4

Eine Eigenschaft ist eine Art Short Getter und / oder Setter. Sie können der setoder getder Eigenschaft Logik hinzufügen oder sie privat machen, was bedeutet, dass von außen nicht auf sie zugegriffen werden kann, wobei auf eine Variable immer zugegriffen werden kann (wenn sie öffentlich ist).

Tomas Jansson
quelle
4

In C # wird jede "Variable", die einen Getter und einen Setter hat, als Eigenschaft bezeichnet. Eine Variable hat keine Getter und Setter oder so sagen es die Lehrbücher.

Mein Programmierlehrer hat uns Getter und Setter für fast jede Variable gegeben, die wir in Java erstellt haben. Sogar Indizierungsvariablen ließ er uns einen Getter und Setter verwenden, wenn sie im globalen Klassenbereich deklariert wurden. Ich denke, das war vielleicht übertrieben, aber es hat mich dazu gebracht, Getter und Setter zu machen.

Die wirklichen Dinge über Getter und Setter sind, dass sie höchstwahrscheinlich mehr als nur eine interne Variable setzen. Die meisten Setter werden eine Art Datenvalidierung durchführen, um sicherzustellen, dass Daten auf die Variable gesetzt werden können. Ein Getter kann auch die Rückgabe von Daten auf bestimmte Kriterien überprüfen.

Wenn Ihr Eigentum privat ist und Ihre Setter und Getter öffentlich sind, kann technisch jeder auf Ihre Variable zugreifen und sie ändern, als ob er öffentlichen Zugriff auf die tatsächliche Variable hätte. In Wirklichkeit sollten Sie also Ihre Daten überprüfen, um sicherzustellen, dass sie gültig sind, oder eine andere Datenprüfung.

private int myVariable;
public int myVariable 
{
    get 
    { 
       return myVariable; 
    }
    set 
    {
        if (value < 0) 
        { 
           throw new Exception("This is your exception some where else in code");
        }
        myVariable = value; //remember value is something that is
                            //declared automatically
    }
}

public string FirstName { get; set; }

Das Obige ist eine Kurzform des Schreibens des Folgenden

private string firstName;

public string FirstName
{
    get
    {
       //...code here
    }

    set
    {
       //...code here
    }
}
hemal7735
quelle
3

Variable ist eine Variable.

Eigenschaft ist eine spezielle Art von Methode, die diese Variable verfügbar macht. Und da es sich um eine Methode handelt, können Sie einige andere Dinge darin tun, außer nur die Variable verfügbar zu machen.

Von MSDN:

Die Property-Anweisung führt die Deklaration einer Eigenschaft ein. Eine Eigenschaft kann eine Get-Prozedur (schreibgeschützt), eine Set-Prozedur (schreibgeschützt) oder beides (schreibgeschützt) haben. Sie können die Prozedur Get and Set weglassen, wenn Sie eine automatisch implementierte Eigenschaft verwenden. Weitere Informationen finden Sie unter Automatisch implementierte Eigenschaften (Visual Basic).

Sie können Property nur auf Klassenebene verwenden. Dies bedeutet, dass der Deklarationskontext für eine Eigenschaft eine Klasse, Struktur, ein Modul oder eine Schnittstelle sein muss und keine Quelldatei, kein Namespace, keine Prozedur oder kein Block sein darf. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.

Standardmäßig verwenden Eigenschaften den öffentlichen Zugriff. Sie können die Zugriffsebene einer Eigenschaft mit einem Zugriffsmodifikator in der Eigenschaftsanweisung anpassen und optional eine ihrer Eigenschaftsprozeduren auf eine restriktivere Zugriffsebene anpassen.

Aamir
quelle
0

In Ihrem Beispiel Ahandelt es sich um ein öffentliches Feld in der Klasse ABCund Bum eine öffentliche Eigenschaft in der Klasse ABC. Insbesondere Bhandelt es sich um eine automatisch implementierte Eigenschaft . Dies bedeutet, dass der Compiler "unter der Haube" einen Teil der Arbeit für Sie erledigt und Ihren Code effektiv in Folgendes umwandelt:

public class ABC()
{
   private int b;

   public int A;
   public int B
   {
       get
       {
          return b;
       }
       set
       {
          b = value;
       }
   }
}
rauben
quelle
0

Die Variable wird im Wesentlichen für den Zugriff auf Werte aus einer Klasse oder in dieselbe Klasse gemäß ihrem dieser Variablen zugewiesenen Modifikator definiert.

Wenn wir eine Eigenschaft definieren, werden dort zwei Methoden für eine einzelne Eigenschaft erstellt, sodass zusätzlicher Overhead generiert wird, der den Nachteil der Eigenschaft darstellt.

Die Vorteile von Eigenschaften bestehen darin, einen Wert in eine private Variable der Klasse zu bringen oder zu setzen.

Yash
quelle
0

Es gibt einen sehr guten Artikel (Link unten) über die Verwendung von Feldern / Variablen im Vergleich zu Eigenschaften von Microsoft. Obwohl der Artikel im Wesentlichen über eine FxCop-Verstoßregel spricht, definiert er klar den Unterschied zwischen den beiden und den genauen Verwendungsrichtlinien.

Ein Auszug aus dem Artikel:

Die primäre Verwendung eines Feldes sollte als Implementierungsdetail erfolgen. Felder sollten privat oder intern sein und mithilfe von Eigenschaften verfügbar gemacht werden. Der Zugriff auf eine Eigenschaft ist so einfach wie der Zugriff auf ein Feld. Der Code in den Accessoren einer Eigenschaft kann sich ändern, wenn die Funktionen des Typs erweitert werden, ohne dass Änderungen vorgenommen werden.

Siehe: https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-3.0/ms182141(v=vs.80)

Ayushmati
quelle