2016-07-22 6 views
1

Ich habe eine Schnittstelle mit einer Nur-Lese-EigenschaftLegen Sie eine Nur-Lese-Eigenschaft in einer Schnittstelle innerhalb einer konkreten Klasse definierte

public interface IPerson 
{ 
    string Name { get; } 
} 

und einer konkreten Klasse ...

public class Person : IPerson 
{ 

    public Person() 
    { 
     Name = "Person"; 
    } 

    public string Name 
    { 
     get 
     { 
      return Name; 
     } 
    } 
} 

ich Namen will nur extern zu dieser Klasse gelesen werden, aber wie setze ich es aus der konkreten Klasse heraus?

Fehler: Person.Name kann nicht zugewiesen werden.

Wie setze ich den Wert dieser Eigenschaft innerhalb der Klasse Person?

+0

Ich weiß jetzt, dass ich konnte einfach ausgeschlossener die Rückkehr Namen; bisschen und hatte gerade den bekommen; – MikeJ

Antwort

6

Das hat nichts mit der Schnittstelle zu tun, Sie deklarieren die Eigenschaft nur falsch. In C# 6 können Sie eine schreibgeschützte Eigenschaft wie folgt erstellen:

public class Person : IPerson 
{ 
    public Person() 
    { 
     Name = "Person"; 
    } 

    public string Name { get; } 
} 

In früheren Versionen können Sie eine Nur-Lese-Feld verwenden die Sicherung, die Sie festlegen können:

public class Person : IPerson 
{ 
    private readonly string _name; 

    public Person() 
    { 
     _name = "Person"; 
    } 

    public string Name 
    { 
     get { return _name; } 
    } 
} 

Beachten Sie, dass die Schnittstelle erfordert nur die Eigenschaft hat einen Getter, die Implementierung muss nicht schreibgeschützt sein. Sie könnten einen Setter hinzufügen, wenn Sie Grund, den Wert zu ändern haben:

public class Person : IPerson 
{ 
    public Person() 
    { 
     Name = "Person"; 
    } 

    public string Name { get; set; } 
} 

Der Setter privat sein könnte, wenn man nur von innerhalb der Klasse den Wert der Lage sein, benötigt zu ändern.

+0

Dies funktioniert nur, wenn die Eigenschaft wirklich nur schreibgeschützt sein soll. Aus der OP-Beschreibung geht nicht eindeutig hervor, ob er den Wert später innerhalb der Klasse "Person" ändern möchte. – Luaan

+0

Danke - ich verstehe, wie das jetzt funktioniert. Ich muss den einmal geschriebenen Namen nicht ändern (in diesem Beispiel), aber wenn ich es tat - dann würde ich Accessoren verwenden – MikeJ

5

Sie können eine private Eigenschaft verwenden, um den Wert zu halten.

public class Person : IPerson 
{ 
    private string _name; 
    public Person() 
    { 
     _name = "Person"; 
    } 

    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
    } 
} 
3

Versuchen accessors mit:

private string _name; 

public string Name 
{ 
    get 
    { 
     return _name; 
    } 
} 

Sie können dann den Wert von _name innerhalb jeder Methode oder Konstruktor festgelegt.

4

Sie versuchen gerade, die Eigenschaft durch Lesen der Eigenschaft zu lesen. Unnötig zu sagen, dass dies zu einer Endlosschleife führt. Stattdessen müssen Sie entweder vollständige Autoeigenschaften oder ein manuelles Hintergrundfeld verwenden.

public class Person : IPerson 
{ 
    public Person() 
    { 
     Name = "Person"; 
    } 

    public string Name { get; private set; } 
} 
3

Sie einfach einen privaten Setter haben (pre C# 6):

public class Person : IPerson 
{ 

    public Person() 
    { 
     Name = "Person"; 
    } 

    public string Name { get; private set; } 

} 
Verwandte Themen