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

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

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

这真的让我很困惑,请你给一些建议,谢谢!

4

3 回答 3

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";
    }
}
于 2013-10-28T02:06:30.423 回答
0

它是有效的,但你必须确保 Next 已定义

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

}

它是可访问的,因为您在 Node 类中,所以私有在范围内。基本上,一个节点就是一个节点

于 2013-10-28T02:03:37.740 回答
0

来自 C# 手册

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

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

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

所以你的代码是有效的,因为你是this.Next.Name同一个命名空间访问的。哪个this私人访问权限。

于 2013-10-28T02:09:56.413 回答