簡體   English   中英

C# - 值類型的引用包裝器

[英]C# - reference wrapper for value type

我想使用 c# Point類型作為引用類型(它是一個結構)。 我想有一個 class CPoint ,它將包含一個Point成員。 有什么辦法可以讓Point的成員成為Cpoint的成員。 我試圖避免

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

我想要做

cpoint.X;
cpoint.Y;

以及保留所有轉換、運算符、 Empty等。
這很容易做到嗎?

像這樣的東西?

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

我認為唯一的方法是重寫和傳遞所有屬性,運算符和方法,就像這樣:

public class PointReference {
  private Point point;

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

(類名的更改是有意的; CPoint不是很有表現力。)

如果您需要它作為引用類型,那么使用ref關鍵字。 它將允許您通過引用傳遞。 有了這個,你將獲得它作為一個結構的所有性能優勢,以及具體了解你期望它作為一個參考。 您還可以使用out關鍵字通過引用返回參數。

如果您需要它能夠表示null,那么使用Nullable<T>

如果您只是想訪問就像foo.MyPoint.X那么將其聲明為如下字段:

class Foo {
  public Point MyPoint;
}

只需創建一個通用包裝器類型。

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

    public T Value { get; set; }

    public static explicit operator Ref<T>(T value) => new(value);

    public static implicit operator T(Ref<T> value) => value.Value;

    public override string? ToString() => Value!.ToString(); // let fail and NullReferenceException
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM