【问题标题】:Asymmetric Accessor Accessibility (C#) -- why?非对称访问器可访问性(C#)——为什么?
【发布时间】:2011-11-06 08:12:06
【问题描述】:

根据 MSDN 中的this 页面,事实证明,特定访问器的可访问性必须比索引器和属性本身更具限制性。

现在,我了解它的含义以及其他几种情况(请参阅C# - Improving encapsulation of property in this example?ERROR: the accessibility modifier of the set accessor must be more restrictive than the property or indexerWhy is internal protected not more restrictive than internal? 等问题)。

我不明白的是(这是这里的问题)......有什么理由强制执行吗?

对我来说,这样的事情有什么问题并不明显:

// THIS IS WRONG -- I want this to be set by this class and its derivated
protected MyPropertyType MyProperty 
{ 
    get; // this is protected, by the accessibility of the property
    protected set; // this is wrong -- why?
}

我认为这种问题的答案可能如此明显,以至于一旦我得到答案我会感到非常愚蠢......但我就是找不到它,我自己也无法得到它。所以……随意开火!

【问题讨论】:

  • 我一直认为这是为了避免冗余而故意强加在语法上的功能。
  • 这是多余的,你为什么要这个?
  • @FishBasketGordo 可能,但这听起来更像是“可读性”增强,而不是真正的编译器错误级别。
  • @CodeInChaos 这是多余的,但我看不出为什么不允许这样做。此外,这超出了问题的范围,但属性级别可用于指定 setter 和 getter 的默认访问级别,并且它们上的访问修饰符可以设置实际级别。没有冗余,有多种选择。

标签: c# access-modifiers


【解决方案1】:

我不明白的是(这是这里的问题)......有什么理由强制执行吗?

我怀疑这是为了清楚起见。你的语法:

protected MyPropertyType MyProperty 
{ 
    get;
    protected set;
}

实际上,与不指定设置器的可访问性相同,即:

protected MyPropertyType MyProperty 
{ 
    get;
    set;
}

但是,在查看代码时,似乎您打算限制可访问性。让编译器强制特定访问器需要更多限制性可访问性,这可能会通过减少冗余来强制简化代码,从而减少错误的总数。

【讨论】:

  • 我猜你是对的,如果你进一步“限制”访问级别,那么它应该小于或等于(尽管这里不允许相等的级别)。但是,我们正在设置访问级别,我们是否必须进一步限制它的访问?这对类来说是有意义的(因为可访问性必须是类本身和方法/属性的交集),但是如果不是它的 setter 和 getter,那么属性是什么?
  • @Alpha:使用当前机制,您始终可以拥有任何 2 个可访问性 - 如果您想要一个比 getter“更”可访问的 setter,您只需将属性设置为该属性,然后继续。这里的优点是该属性的可访问性表明该属性在某个级别上可以被指定级别的“外部世界”访问 - 即使它的一部分受到更多限制。
猜你喜欢
  • 2022-01-22
  • 2017-02-21
  • 2012-10-03
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多