.net C# -值类型的引用 Package 器

afdcj2ne  于 2023-05-23  发布在  .NET
关注(0)|答案(4)|浏览(194)

我想使用c# Point类型作为引用类型(它是一个结构体)。我想到了一个类CPoint,它将包含一个Point成员。是否有任何方法可以提升Point的成员作为Cpoint的成员。我在努力避免

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

我想做

cpoint.X;
cpoint.Y;

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

ggazkfy8

ggazkfy81#

像这样的吗

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

nxagd54h

nxagd54h2#

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

public class PointReference {
  private Point point;

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

(The拟更改类名; CPoint不是很有表现力。)

2fjabf4q

2fjabf4q3#

如果你需要它像引用类型一样,那么使用ref关键字。它将允许您通过引用传递。这样你就可以从结构体中获得所有的性能优势,并且知道你希望它什么时候像引用一样工作。您也可以使用out关键字通过引用返回参数。
如果需要它能够表示null,则使用Nullable<T>
如果你只是想访问像foo.MyPoint.X这样的字段,那么就像这样声明它:

class Foo {
  public Point MyPoint;
}
ymzxtsji

ymzxtsji4#

创建通用 Package 类型。

public sealed class Ref<T> where T : struct
{
    public Ref(T value) => Value = value;

    public T Value { get; set; }
    public static implicit operator T(Ref<T> value) => value.Value;
}

相关问题