为啥内部保护不比内部更严格?

Posted

技术标签:

【中文标题】为啥内部保护不比内部更严格?【英文标题】:Why is internal protected not more restrictive than internal?为什么内部保护不比内部更严格? 【发布时间】:2010-11-07 00:38:23 【问题描述】:

我想创建一个内部自动属性:

internal bool IP  get; protected internal set; 

我认为可以将设置器设为protectedprotected internal - 但我总是收到错误可访问性修饰符必须比属性更具限制性。不是这样吗? Private 对我没有帮助,在这里。

编辑: 问题是:如何使用内部 getter 和受保护的 setter 实现自动属性?

【问题讨论】:

您的错误在于将修饰符视为增加限制。修饰符实际上总是减少限制。请记住,默认情况下,事情是“私人的”;只有添加修饰符才能减少它们的限制。 +1 - eric lippert,你总是把它放在最好的地方 其实修饰符的组合减少限制。只有设置一个修饰符确实增加public bool IPget; private set;等限制 【参考方案1】:

实际上是protectedinternal,而不是。它可以通过同一程序集中的派生类和类型访问。认为protected internal 意味着只能由同一程序集中的派生类访问是一种常见的误解。

【讨论】:

好的,如何使 getter 内部化并保护 setter? 你不能。 getter/setter 访问修饰符应该是属性访问修饰符的适当子集。 我的问题实际上是误解,即受保护的内部意味着受保护和内部 - 感谢您指出这一点。 @devinb:我的第一句话可能是。但是第二句话澄清了这个问题:“它可以被派生类和同一个程序集中的类型访问。” 是的,你是对的。我的意思只是对你的第一句话的批评。【参考方案2】:

protected internalprotectedinternal 的限制要少,因为它允许其子类 (protected) 和同一程序集中的任何内容 (internal) 访问某些内容。

【讨论】:

【参考方案3】:

受保护的内部意味着对同一程序集中的类或从包含类派生的类可见 - 换句话说,它对那些满足内部要求或受保护要求的人可见,而不是 AND。以这种方式没有访问修饰符意味着受保护和内部。

【讨论】:

【参考方案4】:

受保护的内部意味着受保护的或内部的,而不是受保护的和内部的。所以范围仅限于相同的程序集或派生类,不一定两者兼而有之。

【讨论】:

【参考方案5】:

在 .NET 级别,有两个相似但不同的访问级别:

FamilyAndAssembly:比受保护或内部更严格 FamilyOrAssembly:比受保护或内部限制更少

C#中的“protected internal”是指FamilyOrAssembly; FamilyAndAssembly 没有修饰符。

因此,您的 protected internal 设置器比 internal 整体属性的限制更少。你可以做的是:

protected internal bool IP  internal get; set; 

但是你的 setter 比你的 getter 受到的限制更少,这很奇怪......

另一个(有点等价的)替代方案是:

internal bool IP  get; set; 

protected void SetIP(bool ip)

    this.IP = ip;

【讨论】:

好的,我的解决方案可能是带有受保护支持字段的内部只读属性。 或者您使用私人二传手的等效替代方案也可以完成这项工作。 我突然想到,(当然是几个月后)setter 仍然可以“内部”访问,这在某些方面比受保护的限制更少。要完全使其成为内部 getter 和受保护的 setter,您必须拥有 protected void SetIP(bool value) 和 internal bool GetIP(),然后拥有一个私有 bool _IP 那么您刚才是不是说 CLR 的整个访问限制级别为 FamilyAndAssembly,如果不借助 IL 魔法等,在 C# 中是无法使用的? @ChrisMarisic:我不知道如果你尝试使用它会发生什么。这可能就像一些被禁止的泛型约束 - C# 编译器会服从它,但不会提供任何方式在您自己的代码中表达它。【参考方案6】:

可访问性修饰符必须比属性更严格

Internal 比 protected 更具限制性:因为受保护的东西可以在程序集之外(通过子类)看到。

当整个IP 属性是内部的(即在程序集外不可见)时,编译器说set 是受保护的(即对程序集外的子类可见)是没有意义的。

【讨论】:

【参考方案7】:

我会考虑这种作弊,因为 Eric Lippert 本人也在 SO 上,但他写了一篇出色的博客文章来考虑这个问题。

Why Can't I Access A Protected Member From A Derived Class, Part Three

最终,他的答案与这里的海报给出的答案基本相同,但他在语言设计和这些功能的实现背后宣传了一些有趣的推理。

【讨论】:

这不是“作弊”。无论如何,发布链接。它节省了我的时间。【参考方案8】:

考虑到 Jon Skeet 提到的内容(以及 user59808 的评论),这不会达到预期的结果吗?

protected internal bool IP get; protected set;

【讨论】:

虽然选择的答案更明确,但我希望包含这个答案,作为替代方法。

以上是关于为啥内部保护不比内部更严格?的主要内容,如果未能解决你的问题,请参考以下文章

内部接口 *比内部受保护的构造函数更不可访问?

混淆:内部,受保护和受保护的内部[重复]

受保护的内部成员 [重复]

受保护的内部属性与受保护的属性和 Resharper

Java:访问修饰符比“受保护”更严格,比“私人”限制更少?

受保护的内部[重复]