2013-04-10 8 views
5

Zdaję sobie sprawę, że może to być coś naprawdę podstawowego, ale nie jestem pewien co do najlepszej praktyki, aby osiągnąć następujące.Class Property, GetTable i wewnętrznie możliwe do ustawienia, ale tylko z zewnętrznym

Mam następujące klasy z właściwości ciąg 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 
    } 
} 

życzę następujące czynności, aby mogło być prawdziwe dla właściwości myString:

  • nastawianych wewnętrznie
  • pomniane przeżycie wewnętrznie
  • NIE można ustawiać zewnętrznie
  • Ge ttable zewnętrznie

Dlatego chcę mieć możliwość ustawienia zmiennej myString w klasie i nadania jej wartości tylko do odczytu spoza klasy.

Czy istnieje sposób, aby to osiągnąć bez użycia oddzielnego pobierania i ustawiania funkcji i podejmowania myString własność prywatna, tak jak poniżej:

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

Powyższy przykład pozwala mi ustawić zmienną wewnętrznie, ale nie mają dostępu tylko do odczytu do rzeczywistej właściwości myString spoza klasy.

Próbowałem protected, ale to nie powoduje, że wartość jest dostępna z zewnątrz.

Odpowiedz

7

można zezwolić ustawiająca tylko dla członków klasy, zazwyczaj konstruktor:

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

Albo można zezwolić setter obrębie wewnętrznych memebers/montaż:

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

getter będą jawne.

+0

Idealne, dziękuję za pomoc! :) – Luke

10

Brzmi jak tylko chcesz:

public string MyString { get; private set; } 

że to obiekt z getter publicznej i prywatnej seter.

Nie potrzeba żadnych dodatkowych metod.

(Zauważ, że użycie słowa „wewnętrznie” jest potencjalnie mylące tutaj, ze względu na specyficzny sens słów kluczowych internal ciągu C#.)

2

Można określić modyfikatory dostępu na pobrać i ustawić, na przykład:

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

Spowoduje to przepełnienie stosu, ponieważ get/set po prostu wywołuje się w kółko. Musisz mieć dostęp do inaczej nazwanego pola wsparcia. –

+0

Już to zaktualizowałem - nie odświeżyłeś strony. Na początku nie zauważyłem oryginalnego błędu w kodzie @ Coultona –

+0

Przepraszamy za zły czas! +1 –

Powiązane problemy