按值传递类型引用类型,但方法不会重新分配instace变量

时间:2017-10-10 13:39:02

标签: c#

我正在尝试复制一个示例,该示例显示当按值将引用类型传递给方法时,可以将值重新分配给实例变量,但不能重新分配传递的类型本身。这是来自Andrew Troelsen的书。 这是代码:

 Rectangle r1 = new Rectangle("Numero", 10, 10, 10, 10);
 Rectangle r2 = new Rectangle();
 ChangeRect(r1);
 Console.WriteLine(r1.top);

构造函数矩形中的第二个参数是“top”变量(int)。

ChangeRect方法是:

static void ChangeRect(Rectangle e)
{
    e.top = 1;
    e = new Rectangle();
}

当我运行它时,我希望r1.top的值更改为1,但是将r1对象重新分配给新对象,并忽略默认构造函数。 但是,当我在r1上调用ChangeRect()方法后打印r1.top的值时,它会一直显示10。 我错过了什么?

1 个答案:

答案 0 :(得分:0)

Rectanglestruct,因此是值类型。如果要修改它并且还有一个新实例,请将ref添加到参数并设置返回类型;

static Rectangle ChangeRect(ref Rectangle e)
{
    e.top = 1;
    return new Rectangle();
}

然后在调用它时,你会有;

Rectangle newRect = ChangeRect(ref r1);

我要指出的是,修改传入的值并返回一个新实例对于名为ChangeRect的方法来说是奇怪的行为。也许考虑将其重命名为SetTopAndGetNew()或分离出两个操作。