wake-up-neo.com

Was sind automatische Eigenschaften in C # und wozu dienen sie?

Könnte jemand eine sehr einfache Erklärung für die automatischen Eigenschaften in C #, deren Zweck und möglicherweise einige Beispiele liefern? Versuchen Sie, die Dinge in Laienform zu halten, bitte!

44
dennis

Automatische Eigenschaften werden verwendet, wenn in den Eigenschaftszugriffsstellen keine zusätzliche Logik erforderlich ist.
Die Erklärung würde ungefähr so ​​aussehen:

public int SomeProperty { get; set; }

Sie sind nur syntaktischer Zucker, so dass Sie nicht den folgenden längeren Code schreiben müssen:

 private int _someField;
 public int SomeProperty 
 {
    get { return _someField;}
    set { _someField = value;}
 }
55
Stecya

Edit: Ein wenig erweitert, werden diese verwendet, um private Variablen in der Klasse zu erleichtern, sie jedoch außerhalb der Klasse sichtbar zu machen (ohne sie ändern zu können).

Oh, und ein weiterer Vorteil von automatischen Eigenschaften ist, dass Sie verwenden Sie sie in Interfaces! (Die keine Mitgliedsvariablen zulassen)

Mit normalen Eigenschaften können Sie Folgendes tun:

private string example;
public string Example 
{
    get { return example; }
    set { example = value; }
}

Mit den automatischen Eigenschaften können Sie etwas sehr Kurzes erstellen:

public string Example { get; set; }

Wenn Sie also ein Feld erstellen möchten, in dem es nur innerhalb der Klasse einstellbar war, können Sie Folgendes tun:

public string Example { get; private set; }

Dies wäre gleichbedeutend mit:

private string example;
public string Example 
{
    get { return example; }
    private set { example = value; }
}

Oder in Java:

private String example;

public String getExample() {
    return example;
}

public void setExample(String value) {
    example = value;
}

Edit: @Paya warnte mich auch bei:

26
Darkzaelus

Wenn Sie sich fragen, warum Sie Eigenschaften oder automatische Eigenschaften verwenden möchten, steht diese Designphilosophie dahinter.

Ein wichtiges Konstruktionsprinzip ist, dass Sie never Felder als öffentlich ausgeben, sondern immer über Eigenschaften auf alles zugreifen. Dies liegt daran, dass Sie nie sagen können, wann auf ein Feld zugegriffen wird, und was noch wichtiger ist, wann es festgelegt ist. In den meisten Fällen werden zum Einstellen oder Abrufen des Werts (z. B. zur Bereichsüberprüfung) keine Verarbeitungsschritte benötigt. Deshalb wurden automatische Eigenschaften erstellt. Sie sind eine einfache, einzeilige Methode zum Erstellen einer Eigenschaft. Der Sicherungsspeicher dafür wird vom Compiler erstellt.

Ich mache dies zwar auch für meine internen Programme, aber es ist wahrscheinlich wichtiger für diejenigen, die für den öffentlichen Gebrauch bestimmt sind (Verkauf, Open Source usw.). Wenn Sie eine automatische Eigenschaft verwenden und später entscheiden, dass Sie in der Variablen set oder get etwas anderes tun müssen, können Sie Ihren Code problemlos ändern, ohne die öffentliche Schnittstelle zu beschädigen.

10
Jim

Sie sind nur eine Codierungsverknüpfung, um dem Programmierer einige Tastatureingaben zu sparen. Anstatt all das einzugeben:

private string _lastName;
public string LastName {
    get {
        return _lastName;
    }
    set {
        _lastName = value;
    }
}  

sie können einfach schreiben:

public string LastName {
    get; set;
} 

und lassen Sie den Compiler den Rest automatisch generieren.

3

Von Automatisch implementierte Eigenschaften (C # -Programmierhandbuch) :

In C # 3.0 und höher machen automatisch implementierte Eigenschaften die Deklaration von Eigenschaften präziser, wenn keine zusätzliche Logik in den Eigenschaftszugriffsfunktionen erforderlich ist. Sie ermöglichen auch Client-Code zum Erstellen von Objekten.
Wenn Sie eine Eigenschaft deklarieren, erstellt der Compiler ein privates, anonymes Unterstützungsfeld, auf das nur über die Get- und Set-Accessoren der Eigenschaft zugegriffen werden kann.

class Person
{
       public string Name { get; set; }
}
1
Akram Shahda

Um frühere Versionen von C # verwenden zu können, müssen Sie zur Verwendung von Eigenschaften ein Feld erstellen, in dem der Wert gespeichert wird (als Backing Store bezeichnet):

private string _something;
public string Prop { get { return _something; } }

Ab C # 3.0 wird diese Anforderung nicht mehr benötigt, und der Compiler erstellt automatisch den Sicherungsspeicher für Sie. Daher müssen Sie das Feld _something nicht deklarieren.

Weitere Informationen hierzu finden Sie hier: http://msdn.Microsoft.com/en-us/library/bb384054.aspx

Hoffe das hilft.

1
lysergic-acid

Viele Leute haben bereits angegeben, dass Autoeigenschaften syntaktischer Zucker sind - eine Kurzform, um einfache Eigenschaften zu schreiben. Ich werde auf die Unterschiede zwischen einer öffentlichen Variablen und einer öffentlichen Eigenschaft eingehen und erläutern, warum Sie beim Wechsel zwischen den beiden Variablen eine Neukompilierung durchführen müssen. Nehmen Sie folgendes:

public class MyClass
{
    public int MyPublicVariable = 0;

    public int MyPublicProperty
    {
        get;
        set;
    }
}

Einmal kompiliert, konzeptionell, sieht es ungefähr so ​​aus:

public class MyClass
{
    public int MyPublicVariable = 0;

    private int MyPublicProperty = 0;

    public int get_MyPublicProperty()
    {
        return MyPublicProperty;
    }

    public void set_MyPublicProperty( int value )
    {
        MyPublicProperty = value;
    }
}

Vor langer Zeit wurden Eigenschaften erfunden, um Paare von get- und set-Methoden schnell und einfach zu definieren. Dadurch wurde der Code besser lesbar und verständlicher, da Absichten vermittelt und Konsistenz sichergestellt wurden.

MyClass myClass = new MyClass();

myClass.MyPublicVariable = 2;

myClass.MyPublicProperty = 2;

Einmal kompiliert, wieder konzeptionell, sieht es ungefähr so ​​aus:

MyClass myClass = new MyClass();

myClass.MyPublicVariable = 2;

myClass.set_MyPublicProperty( 2 );

Einer der Gründe für den Vorzug öffentlicher Eigenschaften gegenüber öffentlichen Variablen ist, dass die Konsumenten Ihres Codes nicht unbedingt neu kompiliert werden müssen, wenn Sie bei der Entwicklung Ihres Codes eine andere Logik verwenden müssen. Aus diesem Grund wird es oft als Best Practice angesehen. Es ist auch der Grund, warum Autoeigenschaften erfunden wurden - um das Schreiben von Code zu beschleunigen und gleichzeitig diese bewährte Methode beizubehalten.

Es gab auch einige Kommentare zu Schnittstellen. Schnittstellen sind im Wesentlichen ein Vertrag, der das Vorhandensein bestimmter Methoden in jeder Klasse garantiert, die sie implementiert. Wie wir aus dem Vorstehenden wissen, stellen Eigenschaften eine oder zwei Methoden dar, sodass sie in Schnittstellen problemlos funktionieren.

Hoffe das hilft ein wenig.

Hier ist ein weiteres Beispiel, das von Interesse sein könnte:

public class MyClass
{
    private int[] _myArray = new int[ 5 ];

    public int MyArray[ int index ]
    {
        get
        {
            return _myArray[ index ];
        }
        set
        {
            _myArray[ index ] = value;
        }
     }
}
public class MyClass
{
    private int[] _myArray = new int[ 5 ];

    public int get_MyArray( int index )
    {
        return _myArray[ index ];
    }

    public void set_MyArray( int index, int value )
    {
        _myArray[ index ] = value;
    }
}

Bitte beachten Sie: Ich kann mich nicht genau an die Methodensignaturen erinnern, die beim Dekompilieren von Eigenschaften verwendet wurden. Ich denke, es ist 'get_XXX' und 'set_XXX', aber es könnte etwas anderes sein, das sehr ähnlich ist. Solange das Verständnis da ist, ist es wahrscheinlich nicht so wichtig. Am Ende werden sie doch alle zu Speicheradressen :-)

1
Chris

Vereinfachung der akzeptierten Antwort können Sie auch verwenden:

public int SomeProperty { get; private set; }

Es hat den gleichen Effekt und Sie müssen dafür keine weitere Variable mehr anlegen.

0
Javier Olmedo