C#Getter / Setter问题

时间:2010-01-17 22:22:37

标签: c# field getter-setter

说我在课堂上有一个属性:

Vector3 position{get; set;}

所以我在某处创建了该类的实例,现在我想改变position.x,这是不可能的,因为getter和setter设置并获取整个对象。所以我必须让一个临时的Vector3改变它的值,然后分配它。

通常情况下,我会将位置设为公共字段,以便解决问题。但是我不能在这种情况下这样做,因为position是接口的实现,接口不能有字段。

那么我怎样才能以最好的方式解决这个问题。

编辑:Vector3是一个结构,因此它是一个值类型

4 个答案:

答案 0 :(得分:9)

直截了当的解决方案是否不可接受?

foo.position = new Vector(newX, foo.position.Y, foo.position.Z);

这有什么问题?这看起来非常简单。

答案 1 :(得分:5)

IMO,这是最简单的答案:

private Vector3 position;
public Vector3 Position {
    get {return position;}
    set {position = value;} // with @Mehrdad's optimisation
}
public float X {
    get {return position.X;}
    set {position.X = value;}
}
public float Y {
    get {return position.Y;}
    set {position.Y = value;}
}
public float Z {
    get {return position.Z;}
    set {position.Z = value;}
}

现在,如果您只需要更改一个维度,或者更改obj.X以更改所有内容,则可以更改obj.Yobj.Zobj.Position

如果您需要名称position来实现接口,请明确地执行:

Vector3 IWhateverInterface.position {
    get {return position;}
    set {position = value;}
}

答案 2 :(得分:2)

这是可变值类型的问题之一。您可以使用新的X值创建值类型的新实例,然后重新分配给该属性。您可以通过提供有用的构造函数或添加返回修改对象的方法(而不是修改值)来使实例创建更容易。

答案 3 :(得分:0)

Pre-P.S。看到Vector3是值类型太晚了;因此,以下职位不会有太大帮助。抱歉,这个错误。

嗯,虽然接口不能有字段,但可以具有属性,例如:

interface IVector3
{
    double X { get; set; }
    double Y { get; set; }
    double Z { get; set; }
}

Vector3中,您只需实现其他所有内容:

class Vector3 : IVector3
{
    double IVector3.X
    {
        get { ... }
        set { ... } 
    }
    ...
}

现在回到您的position财产。在初始化期间将属性绑定到固定实例,并仅提供getter:

Vector3 position
{
    get
    {
        return _position;
    }
}

private Vector3 _position = new Vector3(...);

通过将属性设置为只读(即没有setter),可以确保它不会被新的Vector3对象替换。相反,您在初始化时将其绑定到固定实例(_position)。但您可以通过为Vector3position.Xposition.Y分配新值来更改position.Z