为什么C#不提供C ++风格的“friend”关键字?
C ++ friend关键字允许class A
class B
指定class B
作为其朋友。 这使得Class B
访问private
/ protected
的成员class A
。
我从来没有读过任何关于C#(和VB.NET)被遗漏的原因。 这个早期的StackOverflow问题的大部分答案似乎是说它是C ++的一个有用部分,并且有充分的理由使用它。 根据我的经验,我不得不同意。
在我看来,另一个问题实际上是在如何在C#应用程序中做类似于friend
事情。 虽然答案通常围绕着嵌套类,但它看起来不如使用friend
关键字那么优雅。
最初的设计模式书在其示例中经常使用它。
总之,为什么C#中的friend
错过了,在C#中模拟它的“最佳实践”方法是什么?
(顺便说一句, internal
关键字不是同一个东西,它允许整个程序集中的所有类访问internal
成员,而friend
允许您给某个类完全访问另一个类)
在编程中有朋友或多或少被认为是“脏的”并且容易被滥用。 它打破了类之间的关系,破坏了面向对象语言的一些基本属性。
这就是说,这是一个很好的功能,我在C ++中使用了很多次; 并希望在C#中使用它。 但我敢打赌,因为C#的“纯”OOness(与C ++的伪OOness相比),MS决定,因为Java没有朋友关键字C#不应该(只是在开玩笑))
值得注意的是:内部并不像朋友那么好,但它确实完成了工作。 请记住,您很少会将代码分发给第三方开发人员,而不是通过DLL; 所以只要你和你的团队知道内部类和他们的使用,你应该没问题。
编辑让我澄清一下friend关键字如何破坏OOP。
私有和受保护的变量和方法也许是OOP最重要的部分之一。 对象可以保存只有他们可以使用的数据或逻辑的想法允许您编写独立于您的环境的功能实现 - 并且您的环境不能更改它不适合处理的状态信息。 通过使用朋友,你可以将两个类的实现结合在一起 - 如果你只是耦合了他们的接口,情况会更糟糕。
在旁注中。 使用朋友不是关于封装,而是相反,它是关于强制执行的。 像accessor + mutators,运算符重载,公共继承,向下转换等,它经常被滥用,但并不意味着关键字没有或者更糟糕的目的。
请参阅Konrad Rudolph在其他主题中的消息,或者如果您希望在C ++ FAQ中查看相关条目。
有关信息,.NET中的另一个相关但并非完全相同的东西是[InternalsVisibleTo]
,它允许组件指定另一个组件(例如单元测试组件)(有效地)对类型具有“内部”访问/原始程序集中的成员。
上一篇: Why does C# not provide the C++ style 'friend' keyword?