[英]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.