2013-10-28 68 views
2

夥計,謝謝你的時間。 正如我們所知,關鍵詞'私人'和'保護'是非常有用的,以保持一些方法,領域,屬性從課堂以外的無效訪問。但我在特定情況下遇到了問題。這裏是例子:受保護的和私人訪問修改器的問題

Class Node 
{ 
    public string Name {get; private set;}//Private setting authority 
    public int ID {get;set} 

    public Node Previous {get;set;} 
    public Node Next {get;set;} 

    public void Test() 
    { 
    this.Name='Valid'; 
    this.Next.Name='Invalid';//Is this valid?? 
    } 
} 

就像上面的代碼中,我們得到了一個「節點」類這裏命名爲「上一頁」和「下一頁」這兩種性能也是「節點」 type.Now讓我們專注於「測試()」方法。設置'this.Name'是有效的,但是設置'this.Next.Name'很奇怪嗎?不幸的是,編譯器認爲這是一個有效的格式!

據我所知,'私人'意味着它不能在課外使用。但在這種情況下,我可以訪問到'上一個'和'下一個'的任何非公開成員(私人/受保護等)。

這真讓我困惑不已,請大家給點建議,謝謝!

+4

你想知道爲什麼你可以訪問另一個_instance_的setter?你的代碼在同一個類中,即:'Node'。 – canon

+0

另請參見[爲什麼私有字段是私有的類型,而不是實例?](http://stackoverflow.com/questions/6983553/) –

回答

2

Test()方法是Node類的成員,因此它有權訪問private成員;這意味着它可以設置Name屬性。不要緊,這是另一個實例的類 - 它仍然是同一類。

不同類中的方法無權訪問Node類的private成員,因此它可以獲取Name屬性,但未設置它。

實施例:

class Node 
{ 
    public string Name { get; private set; } 
    public int ID { get; set; } 
    public Node Previous { get; set; } 
    public Node Next { get; set; } 

    public void Test() 
    { 
     this.Name = "Valid"; 

     // Works 
     this.Next.Name = "Invalid"; 
    } 
} 

class Other 
{ 
    public void Test() 
    { 
     Node node = new Node(); 

     // Doesn't Work 
     node.Name = "Invalid"; 
    } 
} 
+0

謝謝!所以這個實例或不是無關緊要的。事實是私有屬性在定義範圍中被修改了。是這樣嗎?但是這是一個好主意或正確的方法來修改其他實例的私有屬性,即使它在相同的類型? – Claw

0

它是有效的,但你必須確保下一個定義

public void Test() 
{ 
    this.Next = new Node(); 
    this.Name="Valid"; 
    this.Next.Name="Invalid";//Is this valid?? 

} 

,因爲你的節點類中它是可訪問的,所以私人的範圍。基本上,節點是節點

+0

謝謝!正如你所說,「一個節點是一個節點」!但它是如此奇怪的是,即使它是有效的。就像打破整個和諧的泛音一樣! – Claw

0

從C#手冊

私人的類型或成員只能由在同一類或結構代碼訪問。

您與範圍訪問,而不是命名空間訪問困惑這個..私人並不意味着構件由對象實例本地化。這意味着它通過定義命名空間進行本地化。

這個類是否被實例化並不重要。例如;您可以訪問私有靜態成員。

所以,你的代碼是有效的,因爲你正在訪問this.Next.Name相同的命名空間。其中this已有專用獲得。

+0

感謝您的回答!通常,我將此Access Key Words視爲一些實例事物!因此,即使實例處於相同類型,它也會讓我感到奇怪,無法修改其他實例的私有屬性。雖然它是有效的,但是像上面的示例那樣做是個好主意嗎? – Claw