C# - 值类型的引用包装器

时间:2012-01-04 22:33:41

标签: c# .net

我想使用c#Point类型作为引用类型(它是一个结构)。我想过有一个CPoint类,它包含一个Point成员。有没有办法让Point的成员成为Cpoint的成员。我想避免

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

我想做

cpoint.X;
cpoint.Y;

以及保留所有转化,运营商,Empty等 这可以轻松完成吗?

3 个答案:

答案 0 :(得分:8)

这样的东西?

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; } 
}

编辑:如果您希望将其自动转换为/从点转换,请按上述方式实现隐式转换。注意我没有测试这些,但它们应该工作。更多信息:http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

答案 1 :(得分:5)

我认为唯一的方法是重写和传递所有属性,运算符和方法,就像这样:

public class PointReference {
  private Point point;

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

(更改班级名称; CPoint不具备表现力。)

答案 2 :(得分:4)

如果您需要它作为参考类型,请使用ref关键字。它将允许您通过引用传递。有了这个,你将获得它作为一个结构的所有性能优势,以及具体了解你期望它作为一个参考。您还可以使用out关键字通过引用返回参数。

如果您需要它能够表示null,请使用Nullable<T>

如果您只是想访问就像foo.MyPoint.X那样将其声明为如下字段:

class Foo {
  public Point MyPoint;
}