【问题标题】:Trouble with Protected and Private access modifier受保护和私有访问修饰符的问题
【发布时间】:2013-10-28 01:56:26
【问题描述】:

各位,感谢您的宝贵时间。 正如我们所知,'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' 很奇怪吗?不幸的是,编译器将此视为有效格式!

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

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

【问题讨论】:

标签: c#


【解决方案1】:

Test() 方法是Node 类的成员,因此它可以访问private 成员;这意味着它可以设置Name 属性。它是类的另一个 instance 没关系——它仍然是同一个类。

不同类中的方法无法访问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";
    }
}

【讨论】:

  • 谢谢!所以实例与否无关紧要。事实是私有属性在定义范围内被修改。对吗?但这是修改其他一些的好主意或正确方法实例的私有属性,即使它属于同一类型?
【解决方案2】:

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

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

}

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

【讨论】:

  • 谢谢!正如你所说,“节点就是节点”!但这样做很奇怪,即使它是有效的。就像一个破坏整个和谐的泛音!
【解决方案3】:

来自 C# 手册

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

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

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

所以您的代码是有效的,因为您正在从 same 命名空间访问this.Next.Namethis 拥有私有访问权限。

【讨论】:

  • 感谢您的回答!通常情况下,我将此Access Key Words视为一些实例!因此,即使该实例属于同一类型,修改其他实例的私有属性也让我感到很奇怪。虽然它是有效的,但是像上面的示例那样这样做是个好主意吗?
猜你喜欢
  • 2016-04-03
  • 2011-05-14
  • 2013-03-05
  • 1970-01-01
  • 2019-05-07
  • 2017-05-16
  • 2014-12-29
相关资源
最近更新 更多