2009-03-26 13 views
32

Also hier ist ein bisschen Syntax, die ich noch nie zuvor gesehen habe, kann mir jemand sagen, was das bedeutet? Nicht sicher, ob dies eine Abkürzung für eine abstrakte Eigenschaftserklärung oder etwas oder was sein soll.C# Kurzschrift Eigenschaft Frage

public Class1 myVar { get; set; } 

Für was es wert ist, Class1 ist eine abstrakte Klasse.

Antwort

82

In C# 3.0 und höher, auto-implemented properties machen Property-Deklaration prägnanter, wenn keine zusätzliche Logik in der Eigenschaft Zugriffsmethoden erforderlich ist. Sie ermöglichen dem Clientcode auch das Erstellen von Objekten. Wenn Sie eine Eigenschaft wie im folgenden Beispiel deklarieren, erstellt der Compiler ein privates anonymes Hintergrundfeld, auf das nur über die get- und set-Zugriffsmethoden der Eigenschaft zugegriffen werden kann.

// Auto-Impl Properties for trivial get and set 
    public double TotalPurchases { get; set; } 
    public string Name { get; set; } 
    public int CustomerID { get; set; } 
+1

Ich würde Sie für eine gründlichere Erklärung stimmen, aber ich bin für den Tag aus. – TheTXI

0

Automatische Getter und Setter.

7

Es ist eine automatische oder auto-implemented Eigenschaft, und es ist nicht abstrakt. Sie können diese Eigenschaft unverändert verwenden. Der Compiler erstellt dahinter einen Backing Store.

Es ist sehr viel wie nur ein Feld anstelle einer Eigenschaft zu verwenden, aber Sie erhalten Eigenschaft Semantik und Sie können es für Dinge wie Datenbindung verwenden, die Eigenschaften erfordern.

+0

Und Sie können später zu einer expliziten Implementierung wechseln, ohne Ihre Schnittstelle zu Ihren Anrufern zu ändern. –

27

Dies ist die Syntax, damit der Compiler ein (verstecktes) Feld für Sie erstellen kann.

Ebenfalls sehr nützlich ist:

public Class1 myVar{ get; private set; } 
+0

"geschützt" funktioniert auch nur. Genau wie 'privat'. Ich bin mir ziemlich sicher, dass Sie die Erreichbarkeit auch für "get" einstellen können, aber ich habe es noch nie versucht. –

+1

+1 das ist genau das, wonach ich gesucht habe. Ich wollte, dass etwas in Kurzform eingeschlossen wird, also kann 'set' Operation nur von den Klassenmitgliedfunktionen getan werden. Vielen Dank :-) – shashwat

7

Es ist eine Abkürzung für eine Eigenschaft, die nichts mehr, dass die Speicherung der Wert in einem Feld der Fall ist. So wäre es äquivalent zu:

private Class1 _myVar; 

public Class1 myVar 
{ 
    get{ return _myVar; } 
    set{ _myVar = value;} 
} 

Es ist nur eine einfache Eigenschaft, die ohne Änderung der Schnittstelle mit einem komplexeren evantuation zu einem späteren Zeitpunkt ersetzen yoy konnte.

2

Dies sind Auto-Implementierte Eigenschaften. Sie ermöglichen es Ihnen, den Code prägnanter zu gestalten. Sie können hier mehr über sie lesen:

Auto-Implement

Sie können auch die Zugriffsmethoden haben unterschiedliche Zugriffsebenen machen:

public int MyVar {get; privates Set; }

Dadurch können Sie die Eigenschaft außerhalb der Klasse verfügbar machen und sie dennoch intern festlegen.

22

Es kann wie eine abstrakte Eigenschaft oder eine Eigenschaft von einer Schnittstelle aussehen, aber es ist weit davon entfernt. Um Entwickler dazu zu ermutigen, Eigenschaften zu verwenden (da sie aus vielen Gründen eine Best-Practice-Methode sind), hat Microsoft beschlossen, diese Funktion in C# 3 einzubeziehen, damit Sie Eigenschaften leichter deklarieren können. Hier

ist der normale Weg, eine Eigenschaft zu erstellen:

String foo; 

public String Foo 
{ 
    get { return this.foo } 
    set { this.foo = value; } 
} 

Nun ist diese ziemlich viel Tipparbeit erfordert und als Entwickler zum Kern faul sind, manchmal sind wir den öffentlichen Bereichen zu schaffen versucht, nur einige Zeit zu sparen .

Jetzt mit dem C# 3 Compiler wir dies tun können:

public String Foo { get; set; } 

Während dies ein wenig seltsam aussieht, betrachten die Arbeit, die der Compiler in Ihrem Namen tut. Der vorherige Code wird dazu zusammengestellt:

[CompilerGenerated]  
private string <Foo>k__BackingField; 

public string Foo 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Foo>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Foo>k__BackingField = value; 
    } 
} 

So, obwohl die Syntax sieht ein wenig seltsam, Sie erstellen noch eine Eigenschaft genau so, wie Sie es gewohnt sind.