C#访问变量等值类型属性

C#访问变量等值类型属性,c#,properties,value-type,C#,Properties,Value Type,我想知道,对于C#属性,是否可以执行以下操作 我有一个类“Transform”,它在私有成员字段中保存一个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; }

我想知道,对于C#属性,是否可以执行以下操作

我有一个类“Transform”,它在私有成员字段中保存一个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#中可能吗?(矢量3和矩阵都是结构。)


谢谢

不,这不行。想想看,你的能手和二传手确实在做一些事情。如果不完全更改语义,就无法绕过它们,而且我也不希望仅仅因为我更改了getter返回的内容就运行setter

你真的必须从可变结构开始吗?你会发现各种各样的怪事。为什么不让它们保持不变,并写下:

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

这样一来,您就不必首先构建
向量3


可变结构很少是正确的解决方案。在极少数情况下,出于性能原因,它们可能是合理的,但我会首先探讨所有其他选项。

不,这不起作用。想想看,你的能手和二传手确实在做一些事情。如果不完全更改语义,就无法绕过它们,而且我也不希望仅仅因为我更改了getter返回的内容就运行setter

你真的必须从可变结构开始吗?你会发现各种各样的怪事。为什么不让它们保持不变,并写下:

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

这样一来,您就不必首先构建
向量3


可变结构很少是正确的解决方案。在极少数情况下,出于性能原因,它们可能是合理的,但我会首先探讨所有其他选项。

正如Jon所说,这只是一个坏主意。无论何时处理简单的值类型(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);

    }

也就是说,不要这样做。我会立即拒绝任何包含此类代码的代码审查。

正如Jon所说,这只是一个坏主意。无论何时处理简单的值类型(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);

    }

也就是说,不要这样做。我会立即拒绝任何包含此类代码的代码审查。

您应该有工作时间,以便我们其他人知道何时需要回答问题……:乔!是的,当然,我也添加了这些函数,但如果可能的话,我想提供直接更改它们的可能性,只是为了方便。我只是认为,从技术上来说,实现自动创建属性值副本的功能应该很容易,更改属性值的内容,然后重新分配属性值-因此我希望它能够以某种方式实现…您应该有工作时间,以便我们其他人知道何时回答问题…:乔!是的,当然,我也添加了这些函数,但如果可能的话,我想提供直接更改它们的可能性,只是为了方便。我只是认为,从技术上来说,实现自动创建属性值副本的功能应该很容易,更改属性值的内容,然后重新分配属性值-所以我希望它能够以某种方式实现。。。