2013-04-10 20 views
5

Bunun gerçekten temel bir şey olabileceğinin farkındayım, ancak aşağıdakileri gerçekleştirmenin en iyi uygulamalarından emin değilim.Sınıf Özelliği, Dahili ve yalnızca dahili olarak alınabilir, ancak yalnızca harici olarak alınabilir

Ben bir dize özelliği myString ile aşağıdaki sınıf var:

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

keşke myString özellik için doğru olması için aşağıdaki:

  • Ayarlanabilir dahili
  • içten gettable
  • Harici olarak ayarlanamaz
  • Ge ttable externally

Bu nedenle, myString değişkenini sınıf içinde ayarlayabilmek ve değerini salt okunur olarak sınıfın dışına çıkarabiliyorum.

bir ayrı get'in kullanılmadan bunu başarmak için bir yol ve set fonksiyonu ve myString mülkiyet özel yapım, bu yüzden mi var:

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

Yukarıdaki örnek beni içten değişkeni ayarlamanızı sağlar ancak Sınıfın dışından myString gerçek mülküne salt okunur erişimi yoktur.

protected numaralı telefonu denedim, ancak bu, dışarıdan erişilebilen bir özellik değildir.

cevap

7

genellikle yapıcı, yalnızca sınıf üyeleri için ayarlayıcı izin verebilir:

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

Yoksa iç/montaj memebers içinde ayarlayıcı izin verebilir:

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

alıcı herkese açık olacaktır.

+0

Mükemmel, yardımlarınız için teşekkürler! :) – Luke

10

Bu sadece istediğiniz gibi geliyor: Bir kamu toplamamaddesi ve özel belirleyici ile bir özellik var

public string MyString { get; private set; } 

.

Ekstra yöntemlere gerek yok.

(gıda maddeleri için "içten" potansiyel olarak C# içinde anahtar kelime internal özel anlamda göz önüne alındığında, burada kafa karıştırıcı olduğunu unutmayın.) Örneğin, get üzerinde erişim değiştiricileri belirtmek ve ayarlayabilirsiniz

2

:

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

Bu, get/set'in kendisini tekrar tekrar çağırması nedeniyle yığın taşmasına neden olur. Farklı adlandırılmış bir yedekleme alanına erişmesini sağlamanız gerekir. –

+0

Zaten onu güncelledim - sayfayı yenilemediniz. İlk başta, @ Coulton'un kodu olan –

+0

'daki orijinal hatayı fark etmedim. Kötü zamanlama için üzgünüz! +1 –

İlgili konular