2013-03-30 2 views
5

Ich versuche, eine Klasse zu erstellen, die Wert a als Parameter im Konstruktor nimmt. Es hat eine private Mitgliedsvariable, die diesen Wert speichert. Der Wert sollte danach nicht mehr geändert werden.Konstruieren Klasse, die Eigenschaft kann nur im Konstruktor festgelegt werden, aber überall hinkommen?

Hier ist, was ich habe, es funktioniert, aber ich glaube nicht, es gibt die beste Lösung ist:

internal class Foo 
{ 
    private int a; 
    public int A 
    { 
     get 
     { 
      return this.a; 
     } 
    } 

    public Foo(int a) 
    { 
     this.a = a; 
    } 
} 

Also diese Weise Sie nicht a von außerhalb der Klasse zugreifen können, und A -property nur hat eine get-Methode. Sie können jedoch immer noch innerhalb der Klasse a ändern und eine Eigenschaft verwenden, die nur eine Variable zurückgibt, und nichts anderes fühlt sich dumm an.

Mache ich das richtig, oder gibt es eine Möglichkeit meinen Code zu verbessern/den richtigen Weg, dies zu tun?

Antwort

6

Zusätzlich deklarieren Sie Ihr privates Feld readonly und du bist da!

public class Foo 
{ 
    public Foo(int bar) 
    { 
     this.bar = bar; 
    } 

    public int Bar 
    { 
     get 
     { 
      return bar; 
     } 
    } 
    private readonly int bar; 
} 
+1

Ahh nett, hatte nicht von 'readonly' gewusst, ich habe schon versucht mit' const' aber gab auf, da es nicht im Konstruktor gesetzt werden kann. Nice :) –

0
internal class Foo 
{ 
    private readonly int _a; 
    public int A 
    { 
     get 
     { 
      return _a; 
     } 
    } 

    public Foo(int a) 
    { 
     _a = a; 
    } 
} 

Dies sollte es tun.

+2

Dies wird nicht tun, was OP will. Sie können immer noch "A" innerhalb der Klasse ändern, wenn sie auf "Privat" gesetzt ist. OP möchte es nur einmal aus dem Konstruktor setzen und so wird 'readonly' benötigt. – keyboardP

+0

Sieht cool aus, aber Sie können immer noch 'A' innerhalb der Klasse ändern. Können Sie 'readonly' mit Eigenschaften verwenden? –

+0

Ihr Q ist ein wenig mehrdeutig. Wie von @stakx erwähnt, implementieren Sie 'readonly' nur dann, wenn Sie den Wert einmal zuweisen müssen, oder verwenden Sie 'private set', wenn Sie set nicht der äußeren Klasse aussetzen wollen. –

4

"In C# 6 und später, you can initialize auto-implemented properties similarly to fields". Genau wie Sie ein readonly-Feld in einem Konstruktor initialisieren können, können Sie eine automatische Get-only-Eigenschaft in einem Konstruktor initialisieren. Somit stellt die folgenden jetzt:

public class Class1 
{ 
    public int A { get; } 
    public Class1(int a) 
    { 
     A = a; 
    } 
} 

... und das folgende ergibt einen Fehler:

public class Class1 
{ 
    public int A { get; } 
    public Class1(int a) 
    { 
     A = a; 
    } 
    public void Mutate() 
    { 
     // Class1.cs(11,9,11,10): error CS0200: Property or indexer 'Class1.A' cannot be assigned to -- it is read only 
     A++; 
    } 
} 

Ich mag es-Sie die Prägnanz der Feld Initialisierung mit der Schnittstelle/OOP Freundlichkeit Eigenschaften erhalten.

Verwandte Themen