【问题标题】:C# - reference wrapper for value typeC# - 值类型的引用包装器
【发布时间】:2012-01-04 22:33:41
【问题描述】:

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

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

我想做

cpoint.X;
cpoint.Y;

以及保留所有转换、运算符、Empty 等。
这很容易做到吗?

【问题讨论】:

  • 你为什么想要/需要这样的包装器?
  • @Xint0 就像我说的,将其用作引用类型。
  • @barunch:在此之前,请考虑有一个原因为什么将这种简单类型定义为structs。其中之一是,struct 的分配速度非常快,Point struct 用于绘图方法,其中分配和释放的速度至关重要。
  • @Tigran 这是真的。但是,我没有用它来绘图。我将它(和 Size)用作我的类的属性,而不是用于绘图。我希望能够做MyClass.Pos.X=10 和类似的事情。
  • @barunch:因此,如果您只需要 placeholder,请创建一个简单的类而不是包装器。如果您需要,甚至可以为轻松转换to/from Point struct 定义隐式转换运算符。

标签: c# .net


【解决方案1】:

这样的?

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

【讨论】:

  • 是的,除了为每个运算符和转换执行此操作会非常烦人...
  • 查看添加的隐式转换
【解决方案2】:

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

public class PointReference {
  private Point point;

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

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

【讨论】:

  • 当然,不要使用Point,而是完全自己实现它。
  • 请忽略二传手。可变的Point 引用类型太可怕了。
  • @CodeInChanos:可变的 struct 令人毛骨悚然(在我看来,在大多数情况下是一个糟糕的设计)。相反,可变引用类型是可以的。示例可能是您的位置鼠标位置
  • @CodesInChaos - 如果它不是可变的,那么将其设为引用类型将毫无意义。为值类型创建引用包装器的主要(唯一?)原因是,您可以传递可以修改其内容的标识(所有其他引用都接收更改后的值)。
【解决方案3】:

如果您需要它充当引用类型,请使用ref 关键字。它将允许您通过引用传递。有了这个,您将获得作为结构体的所有性能优势,并明确知道您希望它何时充当参考。您还可以使用out 关键字通过引用返回参数。

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

如果你只是想访问foo.MyPoint.X,那么将其声明为这样的字段:

class Foo {
  public Point MyPoint;
}

【讨论】:

  • 自 C# 首次创建以来,我一直在使用它进行编程,但从不知道您可以做到这一点(将“ref”与值类型一起使用)!但是,这有其局限性:不能将该“引用”存储为集合的元素。
猜你喜欢
  • 2012-07-25
  • 2023-03-09
  • 2018-11-11
  • 2016-12-29
  • 2017-07-31
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多