c# - 在 `ref` 控件中没有 `System.Windows.Forms` 关键字的情况下,按引用传递如何工作

标签 c# .net winforms pass-by-reference ref

我想知道在 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/

相关文章:

C# 字符串测量

c# - WPF3D 如何操纵与相机平行的平面中的对象

c# - 如何获取具有给定属性的属性列表?

c# - 从 Windows 窗体应用程序打开 AutoCAD

c# - Windows登录c#之前打开表单

c# - 在已编译查询中重用现有的 linq 表达式

c# - 常见数据结构的引用单元测试?

c# - 如何检查 LinqToSql DataContext 运行了多少查询?

c# - 在 switch 语句中的默认情况下抛出 NotImplementedException

c# - TransactionScope 在用于数据库单元测试时导致 TransactionManagerCommunicationException