受保护和私有访问修饰符的问题

时间:2013-10-28 01:56:26

标签: c#

伙计们,谢谢你的时间。 正如我们所知,关键词“私有”和“受保护”对于保持某些方法,字段,属性不在课堂外无效访问非常有用。但我在特定情况下遇到了问题。这是一个例子:

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

就像上面的代码一样,我们在这里得到了一个'Node'类,它有两个名为'Previous'和'Next'的属性,它们也是'Node'类型。现在让我们关注'Test()'方法。它是有效的设置'this.Name',但设置'this.Next.Name'是不是很奇怪?不幸的是,编译器将其视为有效的格式!

据我所知,'私人'意味着它不能在课外使用。但在这种情况下,我可以访问'上一页'的任何非公开成员(私人/受保护等...) '下一步'。

这真让我很困惑,请你提出一些意见,谢谢!

3 个答案:

答案 0 :(得分:2)

Test()方法是Node类的成员,因此可以访问private个成员;这意味着它可以设置Name属性。它是该类的另一个实例并不重要 - 它仍然是同一个类。

另一个类中的方法无法访问private类的Node成员,因此它可以获取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";
    }
}

答案 1 :(得分:0)

这是有效的,但您必须确保定义了

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

}

它是可访问的,因为你在Node类中,所以private在范围内。基本上,节点是节点

答案 2 :(得分:0)

来自C#手册

  

private 只能通过同一个类或结构中的代码访问类型或成员。

您将此与范围访问混淆,而不是命名空间访问。私有并不意味着该成员是由对象实例本地化的。这意味着它通过定义名称空间进行了本地化。

该类是否被实例化并不重要。例如;您可以访问私有静态成员。

因此,您的代码有效,因为您正在从相同的命名空间访问this.Next.Name。哪个this具有私人访问权限。