2013-07-21 67 views
0

我對C#中的訪問器有點困惑。我認爲這樣可以做私人訪問者的:C中的私有訪問器#

private string m_name = 
{ 
    get { return m_name; } // Not sure if this is actually correct. Maybe use 'this' 
    set { m_name = value } // Not even sure if this is correct 
} 

我不確定上面的代碼是否有效。我沒有在C#中使用訪問器。

相反,文檔狀態要做到這一點:

class Employee 
{ 
    private string m_name; 

    public string Name 
    { 
     get { return m_name; } 
     protected set { m_name = value; } 
     } 
} 

爲什麼會這樣做,因爲從我的角度來看,用戶仍然可以通過名稱訪問私有財產m_name。這是不是破壞了私人(甚至是保護)財產的地位?

在第一個例子中,編譯器不應該知道它的私有屬性,因此在後臺創建方法(因爲我相信它在編譯時)。

+0

不,受保護的類以外的一個employee.name的實例你不能。 – terrybozzio

+1

這對你來說很棒,這個msdn文章和左邊菜單中的後續文章 - http://msdn.microsoft.com/en-us/library/w86s7x04.aspx – terrybozzio

回答

3

你的第一個例子會給你一個StackOverflo wException,您需要使用單獨的成員來存儲數據或使用「自動屬性」。

要回答你的問題,這樣做的原因是要有效地將該屬性readonly授予該類以外的所有人,但允許在該類內運行的任何代碼仍然設置該屬性。

class Employee 
{ 
    public Employee(string name) 
    { 
     Name = name; 
    } 

    private string m_name; 

    public string Name 
    { 
     get { return m_name; } 
     protected set { m_name = value; } 
    } 

    public void ChangeName(string name) 
    { 
     Name = name; 
    } 
} 

public class Ceo : Employee 
{ 
    public Ceo(string name) : base(name) 
    { 
    } 

    public void VoteOut() 
    { 
     Name = Name + " (FIRED)"; 
    } 
} 


static class MainClass 
{ 
    static void Main(string[] args) 
    { 
     var employee = new Employee("Scott Chamberlain"); 

     Console.WriteLine(employee.Name) //Displays Scott Chamberlain; 

     //employee.Name = "James Jeffery"; //Has a complier error if uncommented because Name is not writeable to MainClass, only members of Employee can write to it. 

     employee.ChangeName("James Jeffery"); 

     Console.WriteLine(employee.Name) //Displays James Jeffery; 
    } 
} 
+1

只讀因素很好,但更大好處是封裝。您如何確定「名稱」可以靈活。 – Guvante

+0

那麼爲什麼不是setter是私人的而不是受保護的呢? – Kashif

+0

@Kashif如果你想讓一個派生類也需要設置值。請參閱我的最新「Ceo」課程。它在基類Employee類的'Name'屬性的末尾添加'(FIRED)'文本。如果'Name'是私人'Ceo'只能讀取'Name'不會將其設置爲新值。 –

0

在給出的示例中,明確定義了後臺字段爲m_name。您可以讓編譯器自動生成方法,但您需要使用不同的語法。

private string m_name { get; set; } 

一個你所看到的斷開的是,你列出的例子提供了以下獲得消費者類:

  • 支持字段 - 私人
  • 獲取價值 - 公共
  • 設置值 - 私人
1

有一個速記其中大部分人使用,而不是:

class Employee 
{ 

    public string Name 
    { 
     get; 
     protected set; 
    } 
} 

更具體地說,雖然,沒有。它沒有。 private,protectedpublic指的是來自其他類的變量的可見性,而不是來自您正在編寫的類內部的變量。

private - 此類中的任何方法或屬性存取器都可以使用此項。

protected - 同上,但派生類中的方法或訪問器也可以看到該變量。

public - 在任何課程的任何地方都可以看到。

internal - 與public相同,但只在當前編譯的程序集中。

1

它完全取決於您消費該財產的環境。

例如,我經常使用的模式如下所示。

public class MyClass 
{ 
    public MyClass(object myPropertyValue) 
    { 
     this.MyProperty = myPropertyValue; 
    } 

    public object MyProperty { get; private set; } 
} 

在該示例中,這個想法是,在創建對象時myProperty的值應該被定義,但在事後從未改變。將set訪問器設置爲private將確保我自己或任何其他人無意中在代碼中的其他位置設置了值。

受保護的訪問器意味着Employee的子類可以設置屬性。 MyClass.MyProperty上的我的私人設置意味着MyClass的子類可以而不是設置該屬性值。

請注意,在您的情況下,私有變量可能也是多餘的。這取決於它可能在哪裏使用。

0

基本上,Accessors將定義您將允許訪問哪些成員或變量。是的,某些類可以爲該成員定義特定的值,但不能直接訪問該成員變量。