2013-03-30 8 views
5

Sto cercando di creare una classe che prende valore a come parametri in esso di costruttore. Ha una variabile membro privata che memorizza questo valore. Il valore non dovrebbe essere modificato in seguito.Costruire la classe, la cui proprietà può essere impostata solo nel costruttore, ma arrivare ovunque?

Ecco quello che ho, funziona, ma non credo che sia la soluzione migliore là fuori:

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

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

Quindi in questo modo non è possibile accedere a al di fuori della classe, e A -property solo ha un metodo get. Tuttavia, è ancora possibile modificare a da dentro la classe, e l'utilizzo di una proprietà che restituisce solo una variabile e niente altro si sente stupido.

sto facendo questo diritto, o c'è un modo per migliorare il mio codice/modo più corretto di fare questo?

risposta

6

Inoltre dichiarare il vostro campo privato readonly e siete arrivati!

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

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

Ahh bello, non aveva saputo di 'readonly', ho già provato ad utilizzare' const' ma ha rinunciato in quanto non può essere impostato nel costruttore. Bello :) –

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

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

Questo dovrebbe farlo.

+2

Questo non farà quello che vuole OP. Sarai comunque in grado di cambiare 'A' dall'interno della classe poiché è impostato su privato. OP vuole solo settarlo una volta dal costruttore e quindi 'readonly' è richiesto. – keyboardP

+0

Sembra interessante, ma puoi ancora cambiare 'A' dall'interno della classe. Puoi usare 'readonly' con proprietà? –

+0

La tua Q è un po 'ambigua. Come menzionato da @stakx, implementa semplicemente 'readonly' se devi assegnare il valore una volta o usare 'private set' se non vuoi esporre il set alla classe esterna. –

4

“In C# 6 e versioni successive, you can initialize auto-implemented properties similarly to fields”. Proprio come è possibile inizializzare un campo readonly in un costruttore, è possibile inizializzare una proprietà auto-implementata get-only in un costruttore. Così, il seguente ora compila:

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

... e le seguenti rese un errore:

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++; 
    } 
} 

mi piace-si ottiene l'essenzialità di inizializzazione del campo con l'interfaccia/OOP-compatibilità delle proprietà.

Problemi correlati