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

Bar*_*uch 9 .net c#

我想使用c#Pointtype作为引用类型(它是一个struct).我想过有一个CPoint包含Point成员的课程.有没有办法提高成员Point作为成员Cpoint.我想避免

cpoint.point.X;
cpoint.point.Y;
Run Code Online (Sandbox Code Playgroud)

我想要做

cpoint.X;
cpoint.Y;
Run Code Online (Sandbox Code Playgroud)

以及保留所有转换,操作员Empty等.
这可以轻松完成吗?

Chr*_*ain 9

像这样的东西?

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; } 
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,除了为每个操作员和转换执行此操作会变得非常烦人...... (2认同)

Yog*_*ogu 5

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

public class PointReference {
  private Point point;

  public int X { get { return point.X; } set { point.X = value; } }
}
Run Code Online (Sandbox Code Playgroud)

(类名的更改是有意的; CPoint不是很有表现力.)

  • 当然,根本不要使用"Point",而是完全自己实现它. (5认同)
  • @CodeInChanos:一个可变的*struct*令人毛骨悚然(在我看来,在大多数情况下是一个糟糕的设计).相反,可变引用类型是可以的.示例可能是*您的位置*或*鼠标位置*. (3认同)
  • @CodesInChaos - 如果它不可变,那么将它作为引用类型是没有意义的.为值类型创建引用包装器的主要(仅?)原因是,您可以传递可以修改其内容的标识(所有其他引用都接收更改的值). (2认同)

Cha*_*ert 4

如果您需要它像引用类型一样工作,请使用ref关键字。它将允许您通过引用传递。这样,您将获得结构体带来的所有性能优势,并具体了解何时希望它像引用一样发挥作用。您还可以使用out关键字通过引用返回参数。

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

如果你只是想访问就像foo.MyPoint.X然后将其声明为一个字段,如下所示:

class Foo {
  public Point MyPoint;
}
Run Code Online (Sandbox Code Playgroud)