【问题标题】:c# public property inaccessiblec# 公共属性不可访问
【发布时间】:2012-08-13 06:24:11
【问题描述】:
[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    int Id { public get; protected set; }
    [DataMember]
    string Name { public get; protected set; }
}

[KnownType(typeof(UniqueNamedItem))]
[DataContract]
public class BasicNode : UniqueNamedItem
{
    [DataMember]
    SortedList<string, BasicNode> Children { public get; private set; }

    public void addChild(BasicNode bn)
    {
        this.Children.Add(bn.Name, bn);
    }
}

您能告诉我为什么在我的 addChild 函数中调用 bn.Name 无效,即使 UniqueNamedItem.Name 属性具有公共 get 访问器?

【问题讨论】:

  • 是什么让您认为这些属性是公开的?

标签: c# properties public


【解决方案1】:

类成员的default accessibilityprivate

所以IdNameprivate

您需要添加正确的访问修饰符(我添加了public,您的意思可能是protected):

[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    public int Id { public get; protected set; }
    [DataMember]
    public string Name { public get; protected set; }
}

始终声明您想要的可访问性的一个很好的理由。

【讨论】:

  • 我有 1 个问题。我们可以像 Danny R 那样通过 Child Class 对象访问 Parent 类变量吗? bn.Name bn 是 basicNode 对象,Name 不是 BasicNode 类的成员。你能解释一下吗?
  • @WaqarJanjua - 如果它被继承,它可以被子类直接访问。由于BasicNode 继承自UniqueNamedItem,因此它有一个Name 成员,并且具有正确的访问修饰符,它可以访问它。
【解决方案2】:

UniqueNamedItem.Name 属性本身是private;您需要将该属性显式标记为public

访问器上的修饰符只能进一步限制访问,不能增加访问。

【讨论】:

  • 对于这个用途,protected 就足够了(假设 OP 想要那种封装)。
【解决方案3】:

您需要将您的属性声明为公开的(见下文)。默认是私有的。

[DataContract]
public class UniqueNamedItem
{
    [DataMember]
    public int Id { public get; protected set; }
    [DataMember]
    public string Name { public get; protected set; }
}

【讨论】:

    【解决方案4】:

    您需要公开您的属性:

    [DataContract]
    public class UniqueNamedItem
    {
        [DataMember]
        public int Id { public get; protected set; }
        [DataMember]
        public string Name { public get; protected set; }
    }
    

    【讨论】:

      【解决方案5】:

      您的属性未明确标记为公共,因此 C# 自动将它们视为私有。

      所以:

      [DataContract]
      public class UniqueNamedItem
      {
          [DataMember]
          int Id { public get; protected set; }
          [DataMember]
          public string Name { public get; protected set; }
      }
      

      【讨论】:

        【解决方案6】:

        默认访问是私有的,因为如果您在真正应该私有的时候将其公开,它不会阻止任何正确的代码工作,而且在您意识到之前可能会持续多年(这也是一种破坏更改为然后修复它)。

        另一方面,如果您在应该公开的时候将某些内容设为私有,则某些内容将立即停止工作,您继续使用 stackoverflow,一堆人说它是私有的,您修复它,一切都很好。

        因此这是一个合理的默认设置。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-04
          • 2017-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          相关资源
          最近更新 更多