我正在尝试复制一个示例,该示例显示当按值将引用类型传递给方法时,可以将值重新分配给实例变量,但不能重新分配传递的类型本身。这是来自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。 我错过了什么?
答案 0 :(得分:0)
Rectangle
是struct
,因此是值类型。如果要修改它并且还有一个新实例,请将ref
添加到参数并设置返回类型;
static Rectangle ChangeRect(ref Rectangle e)
{
e.top = 1;
return new Rectangle();
}
然后在调用它时,你会有;
Rectangle newRect = ChangeRect(ref r1);
我要指出的是,修改传入的值并返回一个新实例对于名为ChangeRect
的方法来说是奇怪的行为。也许考虑将其重命名为SetTopAndGetNew()
或分离出两个操作。