你如何写一个属性,以便你可以访问内部变量?

时间:2011-09-22 21:00:21

标签: c# .net c#-4.0 properties

我有一个属性,包含一个我称之为Window的矩形。 当我尝试使用属性来更改矩形的位置或“X”值时,我收到一个错误:“无法修改Window的返回值,因为它不是变量。”

现在我知道我可以直接访问变量,但我更愿意只修改“X”值。我也不想每次修改它时都要创建一个新的矩形。

那么我可以添加到我的属性中,让我通过属性修改X值吗?

这是我尝试使用该属性的地方:

Window.X -= amount;

这是我有自己的地方:

private Rectangle _window;
public Rectangle Window
{
    get { return _window;}
    set
    {
        if (/*condition*/)
            _window = value;
    }
}

3 个答案:

答案 0 :(得分:7)

问题是Rectanglestruct。属性访问器实际上是一个方法,当它返回struct时,它只是被复制,所以你不能这样修改底层结构。

解决方案:

  1. 如果您的代码是Rectangle,请将其设为类。
  2. r = Window; r.X -= amount; Window = r;
  3. 顺便说一句,你应该感谢C#编译器,因为从技术上讲它可以修改那个X,但它会是临时对象的字段/道具,它会让你以后调试地狱。在C ++中,它实际上是编译的。

    同样很好的例子,为什么结构应该是不可变的。你不会有这种诱惑。

答案 1 :(得分:1)

Rectanglestruct - 因此您的属性会返回,而不是变量。

答案 2 :(得分:0)

它不起作用,因为System.Drawing.Rectangle被定义为结构(值类型)。

这是不允许的,因为当您引用该属性时,您将获得值(struct)的副本。因此,在struct上分配X属性会对Window属性产生影响。