2012-01-04 26 views
9

参照型(構造体)としてC#Point型を使用します。私はクラスCPointを持っていると思っていましたが、これにはPointのメンバーが含まれていました。 PointのメンバーをCpointのメンバーとして務める方法はありますか?私はC# - 値型の参照ラッパー

cpoint.X; 
cpoint.Y; 

など
すべての変換、演算子、Emptyなどを保つためにしたいと思っ

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

を避けるためにしようとしていますが、これは簡単に行うことができますか?

+0

あなたはあなたが簡単にアクセスしたい場合はNullable<T>

を使用し、その後はnullを表現できるようにする必要がある場合foo.MyPoint.Xのようですそのようにのようなフィールドとして宣言/そのようなラッパーが必要ですか? – Xint0

+0

@ Xint0私が言ったように、参照型として使用する。 – baruch

+2

@barunch:そうする前に、そのような単純な型が 'structs'のように定義されている理由があると考えてください。それらのうちの1つは、 'struct'は割り当てが非常に速く、描画メソッドで使われる' Point'構造体で、割り振りと解放の速度が重要となることです。 – Tigran

答えて

4

リファレンスタイプのように機能する必要がある場合は、refキーワードを使用してください。それはあなたが参照渡すことができます。これにより構造体であることから得られるすべてのパフォーマンス上の利点を得るだけでなく、参照のように動作することを期待するときに特に分かります。 outキーワードを使用して、参照によってパラメーターを戻すこともできます。あなたがしたいですか、なぜ

class Foo { 
    public Point MyPoint; 
} 
+1

私は最初に作成されて以来、 ref "に値の型を持つ)!しかし、これには限界があります。その "参照"をコレクションの要素として格納することはできません。 – ToolmakerSteve

5

私は唯一の方法は再書き込みにあると思うパススルーすべてのプロパティ、演算子、および方法を、ちょうどこのように:(クラス名の変更が意図されて

public class PointReference { 
    private Point point; 

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

は、CPointとてもではありません)

+1

唯一の方法ではありませんが、方法はありません – recursive

+0

別の方法をご存知ですか? – Yogu

+5

もちろん、 'Point'を使ってはいけませんが、完全に自分で実装してください。 – recursive

8

これはなんですか?

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

+0

はい、それはすべての演算子と変換のためにこれを行うことは非常に面倒ですが... – baruch

+0

追加された暗黙的な変換を参照 –