2012-06-22 8 views
29

Ich habe Probleme zu verstehen, das Konzept der Getter und Setter in der Sprache C#. In Sprachen wie Objective-C scheinen sie ein integraler Bestandteil des Systems zu sein, aber nicht so sehr in C# (, soweit ich das beurteilen kann). Ich habe Bücher und Artikel bereits gelesen, also meine Frage ist, zu denen von Ihnen, verstehen Getter & Setter in C#, welches Beispiel würden Sie persönlich verwenden, wenn Sie das Konzept zu einem vollständigen Anfänger (das würde so wenig Zeilen umfassen Code wie möglich)?Suchen Sie nach einem kurzen und einfachen Beispiel für Getters/Setter in C#

+0

Das ist ziemlich breit. Was gibt Ihnen speziell Probleme mit C# -Eigenschaften? – arcain

+0

Das ist * wahrscheinlich * ein Duplikat von http://stackoverflow.com/questions/1209359/properties-and-methods – arcain

+0

Ich frage mich, was bei Getter/Setter in C# im Vergleich zu Objective C fehlt? – Vlad

Antwort

13

In C#, Properties repräsentieren Sie Ihre Getters und Setter.

Hier ist ein Beispiel:

public class PropertyExample 
{ 
    private int myIntField = 0; 

    public int MyInt 
    { 
     // This is your getter. 
     // it uses the accessibility of the property (public) 
     get 
     { 
      return myIntField; 
     } 
     // this is your setter 
     // Note: you can specifiy different accessibility 
     // for your getter and setter. 
     protected set 
     { 
      // You can put logic into your getters and setters 
      // since they actually map to functions behind the scenes 
      DoSomeValidation(value) 
      { 
       // The input of the setter is always called "value" 
       // and is of the same type as your property definition 
       myIntField = value; 
      } 
     } 
    } 
} 

Sie diese Eigenschaft wie ein Feld zugreifen würde. Zum Beispiel:

PropertyExample example = new PropertyExample(); 
example.MyInt = 4; // sets myIntField to 4 
Console.WriteLine(example.MyInt); // prints 4 

Ein paar andere Dinge zu beachten: 1) Sie können sowohl einen Getter und Setter specifiy haben, können Sie entweder ein weglassen.

2) Eigenschaften sind nur "syntaktischer Zucker" für Ihren traditionellen Getter und Setter. Der Compiler erstellt get_ und set_-Funktionen hinter den Kulissen (in der kompilierten IL) und ordnet allen Funktionen diese Referenzen zu.

11

Die meisten Sprachen machen es so, und Sie können es auch in C# tun.

public void setRAM(int RAM) 
    { 
     this.RAM = RAM; 
    } 
    public int getRAM() 
    { 
     return this.RAM; 
    } 

Aber C# gibt auch eine elegantere Lösung dieses Problems:

public class Computer 
    { 
     int ram; 
     public int RAM 
     { 
      get 
      { 
        return ram; 
      } 
      set 
      { 
        ram = value; // value is a reserved word and it is a variable that holds the input that is given to ram (like in the example below) 
      } 
     } 
    } 

Und später Zugang mit.

Computer comp = new Computer(); 
    comp.RAM = 1024; 
    int var = comp.RAM; 

Für neuere Versionen von C# ist es noch besser:

public class Computer 
{ 
    public int RAM { get; set; } 
} 

und später:

Computer comp = new Computer(); 
comp.RAM = 1024; 
int var = comp.RAM; 
+0

Danke für die Erklärung, was 'value' eigentlich ist – jskidd3

1

Einfaches Beispiel

public class Simple 
    { 
     public int Propery { get; set; } 
    } 
1

Soweit ich Getter und Setter verstehen sind Verkapselung zu verbessern. Es gibt nichts komplexes in C#.

Sie definieren eine Eigenschaft auf Objekt wie folgt:

int m_colorValue = 0; 
public int Color 
{ 
    set { m_colorValue = value; } 
    get { return m_colorValue; } 
} 

Dies ist die einfachste Verwendung ist. Es legt im Grunde eine interne Variable fest oder ruft ihren Wert ab. Sie verwenden eine Eigenschaft wie folgt:

someObject.Color = 222; // sets a color 222 
int color = someObject.Color // gets the color of the object 

Sie schließlich auf den Wert in den Setter oder Getter wie dies einige Verarbeitung tun könnte:

public int Color 
{ 
    set { m_colorValue = value + 5; } 
    get { return m_colorValue - 30; } 
} 

wenn Sie setzen überspringen oder erhalten, Ihre Immobilie wird nur lesen oder schreiben. So verstehe ich das Zeug.

3

C# stellt Eigenschaften, die für Sie die meisten schweres Heben zu tun ...

dh

public string Name { get; set; } 

ist eine C# Verknüpfung zu schreiben ...

private string _name; 

public string getName { return _name; } 
public void setName(string value) { _name = value; } 

Grundsätzlich Getter und Setter sind nur Mittel, um die Kapselung zu unterstützen. Wenn Sie eine Klasse erstellen, haben Sie mehrere Klassenvariablen, die Sie möglicherweise anderen Klassen zugänglich machen möchten, damit sie einen Einblick in einige der von Ihnen gespeicherten Daten erhalten. Es mag zwar als eine akzeptable Alternative erscheinen, die Variablen erst einmal öffentlich zu machen, aber auf lange Sicht werden Sie es bedauern, andere Klassen dazu zu bringen, Ihre Klassenmitgliedsvariablen direkt zu manipulieren. Wenn Sie sie dazu zwingen, dies über einen Setter zu tun, können Sie Logik hinzufügen, um sicherzustellen, dass keine merkwürdigen Werte jemals vorkommen, und Sie können diese Logik jederzeit in Zukunft ändern, ohne Dinge zu beeinflussen, die diese Klasse bereits manipulieren.

dh

private string _name; 

public string getName { return _name; } 
public void setName(string value) 
{ 
    //Don't want things setting my Name to null 
    if (value == null) 
    { 
     throw new InvalidInputException(); 
    } 
    _name = value; 
} 
+0

stumme Ignorieren der Setter im Falle einer schlechten Eingabe ist in der Regel eine schlechte Idee – Vlad

+0

Wahrscheinlich ok für ein einfaches Beispiel, aber ich bearbeitet in einer Ausnahme, anstatt eine stille ignorieren. –

0

Intern Getter und Setter sind nur Methoden. Wenn C# kompiliert, generiert es Methoden für Ihre Getter und Setter wie dies zum Beispiel:

public int get_MyProperty() { ... } 
public void set_MyProperty(int value) { ... } 

C# Sie diese Methoden unter Verwendung einer Kurz Hand Syntax deklarieren kann. Die folgende Zeile wird beim Erstellen der Anwendung in die obigen Methoden übersetzt.

public int MyProperty { get; set; } 

oder

private int myProperty; 
public int MyProperty 
{ 
    get { return myProperty; } 
    set { myProperty = value; } // value is an implicit parameter containing the value being assigned to the property. 
} 
0

Getter und Setter in C# sind etwas, das den Code vereinfacht.

private string name = "spots"; 

public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

Und es ruft (nehmen wir an, eine Person obj mit einem Namen Eigenschaft haben):

Console.WriteLine(Person.Name); //prints "spots" 
Person.Name = "stops"; 
Console.Writeline(Person.Name); //prints "stops" 

Dieser Code vereinfacht. In Java müssen Sie möglicherweise zwei Methoden verwenden, eine für Get() und eine für Set(), in C# ist alles an einer Stelle erledigt. Ich tue dies in der Regel zu Beginn meiner Klassen:

public string foobar {get; set;} 

Dies schafft einen Getter und Setter für meine foobar Eigenschaft. Der Aufruf erfolgt auf die gleiche Weise wie zuvor gezeigt. Beachten Sie, dass Sie sowohl get und set nicht einschließen müssen. Wenn Sie nicht möchten, dass die Eigenschaft geändert wird, schließen Sie set nicht ein!

41

denke ich, ein Stück Code illustrieren helfen, was Getter und Setter sind:

public class Foo 
{ 
    private string bar; 

    public string GetBar() 
    { 
     return bar; 
    } 

    public void SetBar(string value) 
    { 
     bar = value; 
    } 
} 

In diesem Beispiel haben wir ein eigenes Mitglied der Klasse, die Bar genannt wird. Die GetBar- und SetBar-Methoden tun genau das, was sie genannt werden - einer ruft das Balkenelement ab und der andere legt seinen Wert fest.

In C# 1.1 + haben Sie Eigenschaften. Die grundlegende Funktionalität ist auch gleich:

public class Foo 
{ 
    private string bar; 

    public string Bar 
    { 
     get { return bar; } 
     set { bar = value; } 
    } 
} 

Die private Member-Leiste ist außerhalb der Klasse nicht zugänglich. Allerdings ist die öffentliche "Bar", und es hat zwei Zugriffsmethoden - get, die wie das obige Beispiel "GetBar()" das private Mitglied zurückgibt, und auch eine Menge - die entspricht der SetBar (String-Wert) -Methode in den genannten Beispiel.

Beginnend mit C# 3.0 und höher wurde der Compiler so optimiert, dass solche Eigenschaften nicht mehr das private Member als Quelle haben müssen. Der Compiler generiert automatisch ein privates Mitglied dieses Typs und verwendet es als Quelle für eine Eigenschaft.

Was der Code zeigt, ist eine automatische Eigenschaft, die über ein vom Compiler generiertes privates Element verfügt. Sie sehen das private Mitglied nicht, aber es ist dort. Dies führte auch zu einigen anderen Problemen - hauptsächlich bei der Zugangskontrolle. In C# 1.1 und 2.0 könnten Sie die bekommen oder setzen Teil einer Eigenschaft nicht angeben:

public class Foo 
{ 
    private string bar; 

    public string Bar 
    { 
     get{ return bar; } 
    } 
} 

Ihnen die Möglichkeit geben, zu beschränken, wie andere Objekte mit der „Bar“ Eigenschaft der Foo-Klasse in Wechselwirkung treten. Beginnend mit C# 3.0 und höher - wenn Sie den automatischen Eigenschaften zu verwenden, wählen würden Sie den Zugriff auf die Eigenschaft angeben müssen, wie folgt:

public class Foo 
{ 
    public string Bar { get; private set; } 
} 

Was das bedeutet, dass nur die Klasse selbst Bar auf einen Wert gesetzt, aber jeder konnte den Wert in Bar lesen.

3

Meine Erklärung würde folgen. (Es ist nicht so kurz, aber es ist ganz einfach.)


Stellen Sie sich eine Klasse mit einer Variablen:

class Something 
{ 
    int weight; 
    // and other methods, of course, not shown here 
} 

Nun, ist es ein kleines Problem mit dieser Klasse: niemand die weight sieht . Wir könnten weight öffentlich machen, aber dann jeder wäre in der Lage, die weight jederzeit ändern (was ist vielleicht nicht das, was wir wollen). Also gut, können wir eine Funktion tun:

class Something 
{ 
    int weight; 
    public int GetWeight() { return weight; } 
    // and other methods 
} 

Das ist schon besser, aber jetzt jeder statt Ebene something.Weight hat something.GetWeight(), zu geben, die, nun ja, hässlich.

Mit Eigenschaften können wir das gleiche tun, aber der Code sauber bleibt:

class Something 
{ 
    public int weight { get; private set; } 
    // and other methods 
} 

int w = something.weight // works! 
something.weight = x; // doesn't even compile 

Nizza, so mit den Eigenschaften, die wir genauere Kontrolle über den variablen Zugriff haben.

Ein anderes Problem: okay, wir wollen den äußeren Code weight setzen können, aber wir möchten seinen Wert kontrollieren, und erlauben nicht die Gewichte niedriger als 100. Darüber hinaus gibt es einige andere innere Variable density , die von weight abhängt, also möchten wir die density neu berechnen, sobald sich die weight ändert. Das traditionell auf folgende Weise

erreicht:

class Something 
{ 
    int weight; 
    public int SetWeight(int w) 
    { 
     if (w > 100) 
      throw new ArgumentException("weight too small"); 
     weight = w; 
     RecalculateDensity(); 
    } 
    // and other methods 
} 

something.SetWeight(anotherSomething.GetWeight() + 1); 

Aber auch hier wollen wir nicht an unseren Kunden, dass er das Gewichtseinstellung eine komplizierte Operation, es ist semantisch nichts anderes als ein neues Gewicht zuweisen. So ist der Code mit einem Setter sieht die gleiche Weise, aber schöner:

class Something 
{ 
    private int _w; 
    public int Weight 
    { 
     get { return _w; } 
     set 
     { 
      if (value > 100) 
       throw new ArgumentException("weight too small"); 
      _w = value; 
      RecalculateDensity(); 
     } 
    } 
    // and other methods 
} 

something.Weight = otherSomething.Weight + 1; // much cleaner, right? 

also keinen Zweifel, Eigenschaften sind „nur“ ein syntaktischer Zucker. Aber es macht den Code des Kunden besser. Interessanterweise taucht die Notwendigkeit für eigenschaftsähnliche Dinge sehr häufig auf. Sie können überprüfen, wie oft Sie die Funktionen wie GetXXX() und SetXXX() in den anderen Sprachen finden.

+0

Dies ist ein hervorragendes Beispiel für meinen Lernstil – CM90

+1

@ CM90: Danke! :) – Vlad

+0

Wirklich schön Erklärung :) –

1

auch hier ist verbreiteter Gebrauch von Getter in konkretem Anwendungsfall,

public class OrderItem 
{ 
public int Id {get;set;} 
public int quantity {get;set;} 
public int Price {get;set;} 
public int TotalAmount {get {return this.quantity *this.Price};set;} 
} 
0

Dies ist ein einfaches Beispiel für ein Objekt „Artikel“ mit Getter und Setter:

public class Article 
    { 

     public String title; 
     public String link; 
     public String description; 

     public string getTitle() 
     { 
      return title; 
     } 

     public void setTitle(string value) 
     { 
      title = value; 
     } 

     public string getLink() 
     { 
      return link; 
     } 

     public void setLink(string value) 
     { 
      link = value; 
     } 
     public string getDescription() 
     { 
      return description; 
     } 

     public void setDescription(string value) 
     { 
      description = value; 
     } 
    } 
+0

Die weniger schöne Sache hier ist, dass die Variablen selbst öffentlich gemacht werden, was ein schlechtes OO-Paradigma ist. Vor allem, wenn Sie explizite Setter und Getter daneben haben. Viel besser ist die Bereitstellung des C# -Paradigmas: public String Title {get; einstellen}; (Gleiches gilt für die anderen 2 Variablen). Dies inkapsuliert die (nicht sichtbare, aber erzeugte) private Variable von der Außenwelt. – GeertVc

Verwandte Themen