我想知道在 System.Windows.Forms
控件中没有 ref
关键字的情况下,通过引用传递是如何工作的。
这是我迄今为止尝试过的代码
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;
}
谁能告诉我这是怎么发生的?
最佳答案
Button
是一种引用类型,因此即使您不传递by引用,您还是传递a> 引用(按值)。换句话说,不会创建对象的副本,而是将指向该对象的“指针”(使用 C++ 术语)传递给函数。
因此,当您更改其属性时,这些更改会反射(reflect)在原始对象中。请注意,分配参数不会反射(reflect)在调用方法中。
int
是值类型,因此在传递之前会创建一个副本(除非通过 ref
传递)。因此,更改(分配)不会传播回调用者。
澄清评论中的回复:
您不能按值传递引用类型对象,即让运行时在传递它之前创建一个副本。但是,引用本身是按值传递的(这就是赋值不会传播到调用者的原因)。您还可以使用Object.MemberwiseClone
(和类似方法)显式创建一个副本,并按值传递该引用。不过,该函数特别会进行浅拷贝,因此在使用它时请注意这一点。
关于c# - 在 `ref` 控件中没有 `System.Windows.Forms` 关键字的情况下,按引用传递如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27454687/