C# 受保护和私有访问修饰符出现问题

C# 受保护和私有访问修饰符出现问题,c#,C#,伙计们,谢谢你们抽出时间。 正如我们所知,关键字“Private”和“Protected”对于防止某些方法、字段和属性在类外无效访问非常有用。但我在特定情况下遇到了一个问题。以下是示例: Class Node { public string Name {get; private set;}//Private setting authority public int ID {get;set} public Node Previous {get;set;} public Node

伙计们,谢谢你们抽出时间。 正如我们所知,关键字“Private”和“Protected”对于防止某些方法、字段和属性在类外无效访问非常有用。但我在特定情况下遇到了一个问题。以下是示例:

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”是否奇怪?不幸的是,编译器将其视为有效格式

据我所知,“Private”表示不能在课堂外使用。但在这种情况下,我可以访问“Previous”和“Next”的任何非公共成员(Private/protected等)


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

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

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

}
它是可访问的,因为您在Node类中,所以private在作用域中。基本上,节点是一个节点

Test()
方法是
节点
类的成员,因此它可以访问
私有
成员;这意味着它可以设置
名称
属性。它是该类的另一个实例并不重要——它仍然是同一个类

另一个类中的方法无权访问
节点
类的
私有
成员,因此它可以获取
名称
属性,但不能对其进行设置

例如:

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";
    }
}
从C#手册

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

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

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


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

您想知道为什么可以访问另一个实例的setter?您的代码在同一类中,即:
节点
。另请参阅,谢谢!所以实例与否并不重要。事实是私有属性在定义范围内被修改了。是这样吗?但是这是一个好主意还是一个正确的方法来修改其他实例的私有属性,即使它是在相同的类型中?谢谢回答!通常,我把这个访问关键词当作一些实例的东西!因此,即使实例是同一类型的,修改其他实例的私有属性也会让我觉得很奇怪。虽然它是有效的,但是像上面的例子那样做是个好主意吗?谢谢!正如你所说,“一个节点就是一个节点”!但是这样做是很奇怪的,即使它是有效的。就像一个泛音打破了整个和谐!