C#中“受保护的”和“受私有保护的”访问修饰符有什么区别? 有人可以举例说明吗?
谢谢。
答案 0 :(得分:1)
关于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
;-)
答案 1 :(得分:0)
私有保护旨在仅允许在同一程序集中(相同点网dll)的派生类(子级)内使用基类的受保护成员变量。
这意味着,如果您在程序集A中创建一个类,并且从另一个程序集B中定义的另一个类派生该类,则程序集A中的类将无法访问程序集B中该类的私有受保护成员变量。 / p>
但是,仅使用protected修饰符可以在派生类时在不同程序集中使用受保护的成员变量。
您还可以看一下内部修饰符,它是一种保护跨程序集的公共变量的类似机制。