为啥内部保护不比内部更严格?
Posted
技术标签:
【中文标题】为啥内部保护不比内部更严格?【英文标题】:Why is internal protected not more restrictive than internal?为什么内部保护不比内部更严格? 【发布时间】:2010-11-07 00:38:23 【问题描述】:我想创建一个内部自动属性:
internal bool IP get; protected internal set;
我认为可以将设置器设为protected
或protected internal
- 但我总是收到错误可访问性修饰符必须比属性更具限制性。不是这样吗? Private
对我没有帮助,在这里。
编辑: 问题是:如何使用内部 getter 和受保护的 setter 实现自动属性?
【问题讨论】:
您的错误在于将修饰符视为增加限制。修饰符实际上总是减少限制。请记住,默认情况下,事情是“私人的”;只有添加修饰符才能减少它们的限制。 +1 - eric lippert,你总是把它放在最好的地方 其实修饰符的组合是减少限制。只有设置一个修饰符确实增加public bool IPget; private set;
等限制
【参考方案1】:
实际上是protected
或internal
,而不是和。它可以通过同一程序集中的派生类和类型都访问。认为protected internal
意味着只能由同一程序集中的派生类访问是一种常见的误解。
【讨论】:
好的,如何使 getter 内部化并保护 setter? 你不能。 getter/setter 访问修饰符应该是属性访问修饰符的适当子集。 我的问题实际上是误解,即受保护的内部意味着受保护和内部 - 感谢您指出这一点。 @devinb:我的第一句话可能是。但是第二句话澄清了这个问题:“它可以被派生类和同一个程序集中的类型访问。” 是的,你是对的。我的意思只是对你的第一句话的批评。【参考方案2】:protected internal
比 protected
或 internal
的限制要少,因为它允许其子类 (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;
【讨论】:
虽然选择的答案更明确,但我希望包含这个答案,作为替代方法。以上是关于为啥内部保护不比内部更严格?的主要内容,如果未能解决你的问题,请参考以下文章