这个问题在这里已有答案:
C#中'protected'和'private protected'访问修饰符之间有什么区别?有人可以用例子解释一下吗?
提前致谢。
这是关于acces modifier。更具体:继承和多个程序集。考虑以下:
对于正常的protected
(沿着private
解释):
class Base
{
private bool X;
protected bool Y;
}
class A : Base
{
public void Foo()
{
X = false; //error: cannot access private member.
Y = true; //can access protected member, but only from classes with `: Base`
}
}
class B
{
public void Foo()
{
A a = new A();
a.X = false; //error: cannot access private member.
a.Y = false; //error: cannot access protected member.
}
}
现在与private protected
的区别在于它必须存在于同一个程序集中才能访问:
所以:
class A : Base
{
public void Foo()
{
X = false; //error: cannot access private member.
Y = true; //can access protected member, but only from classes with `: Base` AND
//they need to be defined in the same assembly as Base
}
}
是有效的,但只有当A
和Base
都在同一个程序集/ dll / exe等编译时才有效。
现在,既然如此清楚,你什么时候use
一个真正的private protected
?
关于这一点可以说很多。一些人(包括我)会争辩说使用private protected
是一种反模式,因为在我看来它与friend keyword密切相关。我必须说,虽然与friend
相矛盾,private protected
保持“污垢”孤立,它仍然是任意行为,逻辑,取决于它的定义的位置。
说完了问题,何时使用它。您可能会感到惊讶我准时使用它一次,这非常有帮助。
考虑以下情况:
graphical object
系统。....然后我会用private protected
;-)
Private protected旨在允许仅在同一程序集中的派生类(子项)内使用基类的受保护成员变量(相同的点网络dll)。
这意味着如果在程序集A中创建一个类,并从另一个程序集B中定义的另一个类派生该类,那么程序集A中的类就无法访问程序集B中类的私有受保护成员变量。
但是,使用仅受保护的修饰符允许在派生类时在不同的程序集中使用受保护的成员变量。
您还可以查看内部修饰符,它是一种跨程序集保护公共变量的类似机制。