c#中protected和private protected有什么区别?
what is the difference between protected and private protected in c#?
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
都编译在同一个 assembly/dll/exe 等
现在,既然这么清楚,你什么时候 use
一个真正的 private protected
?
关于这一点可以说很多。有些人(包括我)会争辩说 private protected
的使用是一种反模式,因为在我看来它与 friend keyword 密切相关。我必须说,尽管与 friend
相矛盾,private protected
使 "the dirt" 孤立,但它仍然是任意行为、逻辑,具体取决于其定义的位置。
话虽如此,问题依然存在,什么时候使用它。你可能会惊讶我准时使用了一次,而且很有帮助。
考虑以下情况:
- 有一个概念性的、装饰模式风格的代码库,例如一些
graphical object
系统。
- 所有对象都将以各种方式 "renderable"。
- 因为你有很多,所以创建一个只有你自己使用的基础 class 很方便。
- 您不希望让其他用户使用此功能,因为它没有很好的文档记录并且确实特定于您的实现
- classes 本身是 public。
.. 然后我会使用 private protected
;-)
Private protected 意味着仅允许在同一个程序集(同一个点网络 dll)中的派生 classes(子)中使用基 class 的受保护成员变量。
这意味着如果您在程序集 A 中创建一个 class,并且您从另一个程序集 B 中定义的另一个 class 派生该 class,那么您的 class来自程序集 A 的程序集 B.
无法访问 class 的私有受保护成员变量
但是,仅使用 protected 修饰符允许在派生 classes 时跨不同程序集使用 protected 成员变量。
您还可以查看内部修饰符,这是一种类似的跨程序集保护 public 变量的机制。
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
都编译在同一个 assembly/dll/exe 等
现在,既然这么清楚,你什么时候 use
一个真正的 private protected
?
关于这一点可以说很多。有些人(包括我)会争辩说 private protected
的使用是一种反模式,因为在我看来它与 friend keyword 密切相关。我必须说,尽管与 friend
相矛盾,private protected
使 "the dirt" 孤立,但它仍然是任意行为、逻辑,具体取决于其定义的位置。
话虽如此,问题依然存在,什么时候使用它。你可能会惊讶我准时使用了一次,而且很有帮助。
考虑以下情况:
- 有一个概念性的、装饰模式风格的代码库,例如一些
graphical object
系统。 - 所有对象都将以各种方式 "renderable"。
- 因为你有很多,所以创建一个只有你自己使用的基础 class 很方便。
- 您不希望让其他用户使用此功能,因为它没有很好的文档记录并且确实特定于您的实现
- classes 本身是 public。
.. 然后我会使用 private protected
;-)
Private protected 意味着仅允许在同一个程序集(同一个点网络 dll)中的派生 classes(子)中使用基 class 的受保护成员变量。
这意味着如果您在程序集 A 中创建一个 class,并且您从另一个程序集 B 中定义的另一个 class 派生该 class,那么您的 class来自程序集 A 的程序集 B.
无法访问 class 的私有受保护成员变量但是,仅使用 protected 修饰符允许在派生 classes 时跨不同程序集使用 protected 成员变量。
您还可以查看内部修饰符,这是一种类似的跨程序集保护 public 变量的机制。