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'是不是很奇怪?不幸的是,编译器将其视为有效的格式!
据我所知,'私人'意味着它不能在课外使用。但在这种情况下,我可以访问'上一页'的任何非公开成员(私人/受保护等...) '下一步'。
这真让我很困惑,请你提出一些意见,谢谢!
答案 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
具有私人访问权限。