2010-12-20 41 views
6

Porque a veces, realmente necesito un amigo.¿Cómo simular C++ friend en C# y VB.NET?

puedo pensar en los siguientes trucos:

  1. Sólo lectura envoltorio - como ReadOnlyCollection. El amigo mantiene el puntero al objeto modificable, mientras que los demás solo pueden acceder al contenedor.
  2. Escribir delegado - el amigo le da al constructor del objeto una referencia a un delegado como uno de los parámetros, el constructor lo llena con una dirección a un método privado que puede usarse para modificar el objeto.
  3. Reflexión: obviamente una mala idea. Incluido para completar.
  4. Conjuntos múltiples: junte a sus amigos en un ensamblaje por separado y configure sus métodos de modificación internal.
  5. Exponga el objeto modificable, pero agregue comentarios a los métodos modificadores "Este es un método de infraestructura, ¡no lo llame!"
  6. Nested classes.
  7. Agregar System.ComponentModel.EditorBrowsable(System.ComponentModel. EditorBrowsableState.Never) atributo para el miembro que desea sólo el amigo para acceder a ocultarlo de IntelliSense.
  8. Implementación de interfaz implícita - ver comentarios.

¿Es esta lista exhaustiva? ¿Alguien puede ordenarlos en orden decreciente de rendimiento? ¿Orden de disminución de pulcritud? ¿Alguna sugerencia sobre cuándo usarla?

+2

Es probable que haya olvidado los tipos anidados. –

+1

Y, por supuesto, implementación de interfaz implícita. En realidad, no oculta el método, pero necesita hacer algo para acceder a él (enviarlo a esta interfaz). – Alex

+0

¿Cómo uso los tipos anidados para simular amigo? –

Respuesta

6

También puede usar el atributo InternalsVisibleTo.

Para un conjunto determinado, A, puede especificar qué otros ensambles pueden tener acceso a los tipos internos de A.

3

En las clases de C# anidadas (como clases privadas) son similares a amigo en C++:

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

    public int b; 

    public class FriendOfRoot 
    {   
     public int d; 
    } 

} 

Editar: Si la simulación de un amigo con clases anidadas que aquí es útil para usted, en el rendimiento Es rápido lo suficiente como las clases regulares (En compilación se determinarán todas las cosas y no habrá problemas de transmisión ni gastos generales).