2009-06-30 6 views
1

C#プロパティで以下が可能かどうかを知りたいと思います。C#変数などの値型プロパティにアクセスする

私はプライベートメンバフィールドに4x4の行列を保持しているクラス「トランスフォーム」を持っています。今、私はこのようなプロパティを作成します:

Matrix m; 
    public Vector3 Position 
    { 
     get { return new Vector3(m[12], m[13], m[14]); } 
     set { m[12] = value.X; m[13] = value.Y; m[14] = value.Z; } 
    } 

をしかし、私は、次の機能を提供したいと思います:

Transform myTransform = new Transform(); 
    myTransform.Position.X += 3.0f; 

それが変動したかのようにプロパティを直接変更することができるように。これは何とかC#で可能ですか? (のVector3とマトリックスは、両方の構造体です。)

感謝!

答えて

4

いいえ、これは動作しません。それについて考えてみてください。あなたのゲッターとセッターは、実際にをして、何かをしています。セマンティクスを完全に変更することなくそれらをバイパスすることはできません。ゲッタが返すものを何か変更したからといって、セッタが動くとは思わないでしょう。

実際ににはの可変構造体がありますか?あらゆる種類のコーナーケースや奇妙なものを見つけることができます。なぜ、彼らは不変にする、と書かないで:あなたが最初の場所でVector3を構築する必要が救う

myTransform.Position = myTransform.Position.OffsetBy(3.0f, 0f, 0f); 

または

myTransform.OffSetPosition(3.0f, 0f, 0f); 

変更可能な構造体は非常に、非常にまれに正しい解決策ではありません。非常に少数のケースでは、彼らはかもしれませんパフォーマンス上の理由で合理的ですが、私は他のすべてのオプションを最初に探るだろう。

+0

質問に答える気にするとき、私たちの残りの部分は知っているように、あなたは...、営業時間を持っている必要があります:D –

+0

私は今、ベッドにオフです。 http://meta.stackexchange.com/questions/555 –

+0

ヘイジョン! 確かに、私はそれらの関数も追加しますが、可能ならば、便宜上直接それらを変更する可能性を提供したいと思います。私はちょうどそれが技術的に自動的にプロパティ値のコピーを作成し、それの内容を変更し、それを再割り当てする機能を実装するのは簡単でなければならないことをthoght - 私はそれが何とか可能であることを期待... – Mat

0

ジョンが言ったように、それだけで悪い考えです。単純な値の型を扱うときはいつでも(そしてVector3は修飾されます)、それらを不変にする方が良いです。

実際に決定されている場合は、に近づけることができますが、何らかの作業が必要です。言われていること

public struct Vector3 
{ 
    public Vector3(float X, float Y, float Z, VectorListener listener) 
    { 
     m_x = X; 
     m_y = Y; 
     m_z = Z; 
     m_listener = listener; 
    } 
    private VectorListener m_listener; 
    private float m_x; 
    private float m_y; 
    private float m_z; 

    public float X 
    { 
     get{return m_x;} 
     set{ m_x = value; m_listener.SetVector(this);} 
    } 
    public float Y 
    { 
     get { return m_y; } 
     set { m_y = value; m_listener.SetVector(this); } 
    } 
    public float Z 
    { 
     get { return m_z; } 
     set { m_z = value; m_listener.SetVector(this); } 
    } 

} 
public interface VectorListener 
{ 
    void SetVector(Vector3 vec); 
} 
public class Transform : VectorListener 
{ 
    private bool m_receivedUpdate; 
    public Vector3 MyVector { get{return new Vector3(1.0f, 1.0f, 1.0f, this);} } 
    public void SetVector(Vector3 vec) 
    { 
     ReceivedUpdate = true; 
    } 
    public bool ReceivedUpdate { get; set; } 
} 

    // and the test... test class omitted for brevity 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Transform transform = new Transform(); 
     Assert.IsFalse(transform.ReceivedUpdate); 

     // the following won't compile 
     //transform.MyVector.X = 3.0f; 

     // but this will work 
     Vector3 vec = transform.MyVector; 
     vec.X = 3.0f; 
     Assert.IsTrue(transform.ReceivedUpdate); 

    } 

はこれをしません。私はすぐにこのようなコードを含むコードレビューを拒否します。

関連する問題