2010-12-20 41 views
6

因为有时候,我真的需要一个朋友。如何在C#和VB.NET中模拟C++的朋友?

我能想到的招数如下的:

  1. 只读包装 - 像ReadOnlyCollection。朋友保持指向可修改对象的指针,而其他人只能访问包装器。
  2. 写代理 - 朋友给对象的构造函数一个委托的引用作为参数之一,构造函数用一个地址填充到可用于修改对象的私有方法。
  3. 反思 - 显然是一个坏主意。包括完整性。
  4. 多个装配 - 将你的朋友放在一个单独的装配中,并设置修改方法internal
  5. 公开可修改对象,但为修饰符方法添加注释“这是一种基础结构方法 - 不要调用它!”
  6. Nested classes.
  7. System.ComponentModel.EditorBrowsable(System.ComponentModel. EditorBrowsableState.Never)属性添加到您希望只有朋友才能访问的成员以将其隐藏到智能感知中。
  8. 隐式接口实现 - 请参阅注释。

这份清单是否详尽?任何人都可以按照性能下降的顺序排序吗?减少整洁的顺序?任何建议何时使用哪些?

+2

你可能忘记了嵌套类型。 – 2010-12-20 17:30:05

+1

而且,当然还有隐式的接口实现。没有真正隐藏该方法,但您需要做一些操作才能访问它(转换到此界面)。 – Alex 2010-12-20 17:35:37

+0

如何使用嵌套类型来模拟朋友? – 2010-12-20 17:42:09

回答

6

您还可以使用InternalsVisibleTo属性。

对于给定的程序集A,您可以指定哪些其他程序集可以访问A的内部类型。

3

在C#中的嵌套类(如私有类)是在C类似于朋友++:

public class Root 
{ 
    private int a; // accessible for friendroot 

    public int b; 

    public class FriendOfRoot 
    {   
     public int d; 
    } 

} 

编辑:如果朋友在这里提供的嵌套类的模拟是对您有用,在性能上它的速度快足够像普通班级(在编译的时候所有的东西都会被确定下来,并且不存在投射问题,也没有开销)。