2012-01-04 18 views
9

Quiero utilizar el tipo C# Point como tipo de referencia (es una estructura). Pensé en tener una clase CPoint, que contendría un miembro Point. ¿Hay alguna manera de plantear los miembros de Point para actuar como miembros de Cpoint. Estoy tratando de evitarC# - Contenedor de referencia para el tipo de valor

cpoint.point.X; 
cpoint.point.Y; 

me gustaría hacer

cpoint.X; 
cpoint.Y; 

, así como mantener todas las conversiones, operadores, Empty, etc.
¿Puede esto fácilmente puede hacer?

+0

¿por qué quiere/Necesito tal envoltorio? – Xint0

+0

@ Xint0 Como dije, para usarlo como un tipo de referencia. – baruch

+2

@barunch: antes de hacer eso, considere que ** hay una razón ** por la cual ese tipo de tipos simples se definieron como 'estructuras'. Una de ellas es que 'struct' es muy rápida en asignación y' Point' struct utilizada en los métodos de dibujo, donde la velocidad de asignación y publicación puede ser crucial. – Tigran

Respuesta

4

Si necesita que actúe como un tipo de referencia, utilice la palabra clave ref. Le permitirá pasar por referencia. Con esto obtendrás todos los beneficios de rendimiento de ser una estructura, además de saber específicamente cuándo esperas que actúe como referencia. También puede usar la palabra clave out para devolver un parámetro por referencia.

Si necesita que sea capaz de representar nula luego usar un Nullable<T>

Si simplemente desea acceder es como foo.MyPoint.X entonces declararemos como un campo de este modo:

class Foo { 
    public Point MyPoint; 
} 
+1

He estado programando en C# desde que se creó por primera vez, y nunca supe que podría hacerlo (utilice " ref "con un tipo de valor)! Sin embargo, esto tiene sus límites: no puede almacenar esa "referencia" como un elemento de una colección. – ToolmakerSteve

5

Creo que la única manera de hacerlo es volver a escribir y de paso a través de todas las propiedades y métodos de los operadores, al igual que este:

public class PointReference { 
    private Point point; 

    public int X { get { return point.X; } set { point.X = value; } } 
} 

(El cambio de nombre de la clase está destinado; CPoint no es muy expresivo.)

+1

no es la única, sino una forma – recursive

+0

¿Sabe de otra manera? – Yogu

+5

Claro, no use un 'Punto' en absoluto, pero impleméntelo usted mismo. – recursive

8

¿Algo como esto?

public class CPoint { 
    private Point _point = new Point(0,0); 
    public double X { get { return _point.X; } set { _point.X = value; } } 
    public double Y { get { return _point.Y; } set { _point.Y = value; } } 
    public CPoint() { } 
    public CPoint(Point p) { _point = p; } 
    public static implicit operator CPoint(Point p) { return new CPoint(p); } 
    public static implicit operator Point(CPoint cp) { return cp._point; } 
} 

EDITAR: Si desea convertir esto automáticamente a puntos o desde puntos, implemente las conversiones implícitas como se indicó anteriormente. Tenga en cuenta que no los he probado, pero deberían funcionar. Más información aquí: http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

+0

Sí, excepto que es muy tedioso hacer esto para cada operador y la conversión y ... – baruch

+0

Ver las conversiones implícitas agregadas –

Cuestiones relacionadas