我对属性访问者有点混淆。
我想要一个内部属性,其set访问器只能被派生类访问。
类似这样的事情
internal [internalClass] MyProperty
{
get {return _prop;}
protected set {_prop = value;}
}
当我这样做时,编译器会抱怨。
MSDN在讨论此特定错误时建议将set
访问修饰符更改为private
这不是我想要的地方。
看起来Protected Internal
应该是一个选项,但是使用此修饰符会产生相同的错误
我有一种感觉,我缺少对访问修饰符的一些基本了解。
感谢
答案 0 :(得分:10)
protected
和protected internal
都不比internal
更具限制性。两者都允许来自不同程序集的派生类型访问setter但不访问getter。 protected internal
可以访问protected
和internal
的 union ,而不是交集。 (有一个访问级别代表CLR中的交集,但它不会被C#公开。)
你可能最好使用一个私有的setter和一个受保护的SetMyProperty
方法,它只调用私有的setter,如果它符合你想要达到的目的。
答案 1 :(得分:2)
内部比受保护更具限制性。内部使成员仅限于当前程序集,而受保护可供程序集外部的任意大量后代访问。
如果您打算在程序集之外的类或后代可以访问此属性,则需要丢失属性的内部属性。如果您打算仅在程序集中使用此属性,请将属性访问器设置为内部。
不幸的是,这意味着您必须放弃对内部属性的访问者的保护。这是一种烦恼,因为即使该属性仅限于您的程序集中的客户端,这并不意味着您真正信任所有这些客户端正确使用您的属性。当你是程序集源代码中唯一的作者时,这是有道理的,但是当有数百个开发人员在一个大型程序集的源代码中运行时,我更愿意在内部类上保留受保护的语义。
答案 2 :(得分:0)
无论出于何种原因,编译器似乎都认为允许内部类在其他程序集中具有派生类。然后,通过派生类将受保护字段视为可用于其他程序集(即,该字段本身没有其类的访问修饰符的概念)。编译器错误表示(即使您知道它不会发生),指示的字段过度扩展其访问权限。