如何模拟C++ C# 和 VB.NET 的朋友吗?
因为有时候,我真的很需要一个朋友。
我可以想到以下技巧:
- 只读包装 - 就像 只读集合。朋友保留指向可修改对象的指针,而其他人只能访问包装器。
- 编写委托 - 朋友向对象的构造函数提供对委托的引用作为参数之一,构造函数将其填充为可用于修改对象的私有方法的地址。
- 反思——显然是个坏主意。包含在内是为了完整性。
- 多个程序集 - 将您的朋友放在一个单独的程序集中,并将修饰符方法设置为
内部
。 - 公开可修改的对象,但向修饰符方法添加注释“这是一个基础结构方法 - 不要调用它!”
- 嵌套类。
- 添加System.ComponentModel.EditorBrowsable(System.ComponentModel. EditorBrowsableState.Never) 属性添加到您只希望好友可以访问的成员,以将其从 IntelliSense 中隐藏。
- 隐式接口实现 - 请参阅注释。
这个清单详尽吗?任何人都可以按照性能下降的顺序对这些进行排序吗?整洁度递减的顺序?有什么建议什么时候使用哪个?
Because sometimes, I really need a friend.
I can think of the following tricks:
- Read only wrapper - like ReadOnlyCollection. The friend keeps the pointer to the modifiable object, while everyone else can access only the wrapper.
- Write delegate - the friend gives the constructor of the object a reference to a delegate as one of the parameters, the constructor fills it with an address to a private method that can be used to modify the object.
- Reflection - obviously a bad idea. Included for completeness.
- Multiple assemblies - put your friends together in a separate assembly and set your modifier methods
internal
. - Expose the modifiable object, but add comments to modifier methods "This is an infrastructure method - don't call it!"
- Nested classes.
- Add
System.ComponentModel.EditorBrowsable(System.ComponentModel.
attribute to the member you want only the friend to access to hide it from IntelliSense.
EditorBrowsableState.Never) - Implicit interface implementation - see comments.
Is this list exhaustive? Can anyone sort these in order of decreasing performance? Order of decreasing neatness? Any suggestions when to use which?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您还可以使用 InternalsVisibleTo 属性。
对于给定的程序集 A,您可以指定哪些其他程序集可以访问 A 的内部类型。
You can also use the InternalsVisibleTo attribute.
For a given assembly, A, you can specify which other assemblies can have access to A's internal types.
在 C# 中,嵌套类(如私有类)与 C++ 中的友元类似:
编辑: 如果此处提供的嵌套类的友元模拟对您有用,那么在性能上它与常规类一样快(在编译所有的事情都将被确定,并且不存在转换问题,也没有开销)。
In c# Nested classes (like private classes) are similar to friend in c++:
Edit: If the simulation of friend with nested classes provided here is useful for you, in performance it's fast enough like regular classes (In compile all things will be determined and there is no casting issues and no overhead).