2013-04-10 13 views
5

Mi rendo conto che questo può essere qualcosa di veramente semplice, ma non sono sicuro della migliore pratica per ottenere quanto segue.Classe Property, Gettable e impostabile internamente, ma accessibile solo esternamente

Ho la seguente classe con una proprietà stringa myString:

public class MyClass 
{ 
    public string myString 
    { 
     get { 
      return myString; 
     } 
    } 

    public void AFunction() 
    { 
     // Set the string within a function 
     this.myString = "New Value"; // Error because the property is read-only 
    } 
} 

auguro quanto segue per essere vero per la myString immobile:

  • impostabile internamente
  • getTable internamente
  • NON impostabile esternamente
  • Ge ttable esternamente

Quindi desidero essere in grado di impostare la variabile myString all'interno della classe e rendere il suo valore di sola lettura dall'esterno della classe.

c'è un modo per raggiungere questo senza l'uso di un get separato e funzione impostata e rendendo il myString proprietà privata, in questo modo:

public class MyClass 
{ 
    private string myString { get; set; } 

    public void SetString() 
    { 
     // Set string from within the class 
     this.myString = "New Value"; 
    } 

    public string GetString() 
    { 
     // Return the string 
     return this.myString; 
    } 
} 

L'esempio di cui sopra mi permette di impostare la variabile internamente, ma non avere accesso in sola lettura alla proprietà effettiva myString dall'esterno della classe.

Ho provato protected ma questo non rende il valore accessibile dall'esterno.

risposta

7

È possibile consentire il setter solo per i membri della classe, di solito costruttore:

public class MyClass 
{ 
    public string myString { get; private set; } 
} 

Oppure si può permettere setter all'interno memebers interni/Struttura:

public class MyClass 
{ 
    public string myString { get; internal set; } 
} 

Il getter sarà pubblico.

+0

Perfetto, grazie per il vostro aiuto! :) – Luke

10

Sembra che si desidera solo:

public string MyString { get; private set; } 

Questa è una proprietà con un getter pubblico e un setter privato.

Nessun bisogno di ulteriori metodi.

(Si noti che l'uso della parola "interno" è potenzialmente fonte di confusione qui, dato il significato specifico della parola chiave internal all'interno di C#.)

2

È possibile specificare modificatori di accesso sulla get e set, ad esempio:

public string MyString 
{ 
    get; 
    private set; 
} 
2
public string myString { get; private set; } 
+0

Ciò causerà un overflow dello stack poiché il get/set chiama semplicemente se stesso più e più volte. Devi aver accesso ad un campo di supporto con un nome diverso. –

+0

L'ho già aggiornato: non hai aggiornato la pagina. All'inizio non ho notato il bug originale nel codice @ Coulton –

+0

Scusate per il cattivo tempismo! +1 –

Problemi correlati