我想知道在ref
控件中没有System.Windows.Forms
关键字时,引用传递是如何工作的。
这是我到目前为止尝试过的代码
ChangeProperties(button1); //Call the method without ref keyword
这是方法
public void ChangeProperties(Button btn)
{
// Code that changes the properties
}
当我通过不带ref
关键字的按钮调用上述方法时,原始按钮的属性会不断变化。
我还使用int
int j=10;
ChangeValue(j);// Value doesn't change without ref keyword
以下是方法。
public static int ChangeValue(int i)
{
i = 0;
return i;
}
谁能告诉我这是怎么回事?
答案 0 :(得分:4)
Button
是一种引用类型,因此即使您不通过>> 引用,您也会传递 a 引用(按价值)。换句话说,没有创建对象的副本,"指针" (使用C ++术语)将其传递给函数。
因此,当您更改其属性时,这些更改将反映在原始对象中。请注意,分配参数将不反映在调用方法中。
int
是一种值类型,因此在传递之前复制是(除非ref
传递)。因此,更改(赋值)不会传播回调用者。
澄清评论中的回应:
在传递运行时创建副本的意义上,您不能按值传递引用类型对象。但是,引用本身是按值传递(这就是赋值不会传播给调用者的原因)。您还可以使用Object.MemberwiseClone
(和类似方法)显式创建副本,并按值传递 引用。该功能特别是制作浅色副本,因此在使用时请注意这一点。