按引用/值的参数如何在C#中工作

瓦杰伊

我有以下示例代码:

    public class MyClass
    {
        public int Value { get; set; }
    }


    class Program
    {
        public static void Foo(MyClass v)
        {
            v.Value = 2;
            v = new MyClass();
            v.Value = 3;
        }

        static void Main(string[] args)
        {
            var m = new MyClass();
            m.Value = 1;
            Foo(m);
            Console.Write(m.Value);
            Console.ReadLine();
        }
    }

我想了解为什么输出是2而不是3,请您给我一些清楚的解释吗?

谢谢

托马斯·尤斯扎克(Tomasz Juszczak)

我将通过调试器逐步介绍您,我们将看到它是什么2。

第1步

我们看到进入Foo并通过引用传递了MyClass的实例v(默认情况下,通过引用传递了C#中的类实例)

在内存中,我们将看到以下内容:

v = 0x01; //0x01 - is a simple representation of a pointer that we passed
v.Value = 1;

接下来,我们走过去,我们看到我们更改了引用中的值Value。 第2步

v = 0x01;
v.Value = 2; // our new value

然后我们分配newv内存中的

v* = 0x01 // this is our "old" object
v*.Value = 2;
v = 0x02 // this is our "new" object
v.Value = 3;

如您所见,内存中有2个对象!新一v和旧标有启动v*

当我们退出该方法时,我们没有替换内存地址的内容,0x01而是创建了v函数范围的本地副本,并在内存地址下创建了一个新对象,该对象0x02在我们的Main方法中未引用。

第三步

我们的主要方法是使用来自我们在Foo方法中创建的0x01地址的实例0x02

为了确保将正确的对象传递出去,我们需要告诉C#我们要使用来“编辑”输出,ref还是要使用来“覆盖”输出out

在后台,它们的实现方式相同!

取而代之的传递0x01给我们的Foo中的方法,我们通过0x03其中有一个指向的类的指针0x01因此,v = new MyClass()当我们使用refor进行赋值out,实际上,我们修改了其值,0x03然后将其值提取并“替换”到我们的Main方法中以包含适当的值!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在C#中实现按引用返回?

在C#中,我应该按值传递参数并返回相同的变量,还是按引用传递?

C ++中的函数重载按值或按引用传递参数

如何在C中传递数量过多的函数参数仍无法按预期工作?

在C#中按引用或值传递对象

在C ++类中,按引用返回如何工作?

如何在 C# 中按范围而不是按标题名称引用数据表的列

如何在泛型方法中引用类型参数的值

ThrowTerminateError如何在C#中工作?

GOTO如何在C#中工作

C# 如何在 2 个类中引用/使用/设置对象/实例的值

如何在MongoDB C#驱动程序中按值的字段范围选择文档?

如何在C#中按组名添加单选按钮的选定值?

如何在C#中按属性名称获取XML节点筛选的值?

如何在 C# 字典中按值索引获取过滤项?

在Visual Studio 2010,C ++中,按值传递的参数在调试器中显示为按引用传递的参数

与C ++相比,我对C#中的按引用传递工作方式是否正确?

引用参数不更改值?C#

C简介-如何在函数中通过引用传递参数?

函数如何修改C ++中按值传递的参数?

在宏中取消引用参数无法按预期工作

c#按值传递参数

使用ExecuteScalar()执行SP时如何在c#中获取输出参数的值

如何在C#中为委托类型的参数提供默认值?

如何在C#中获取当前方法的名称及其参数(名称和值)

C#按值传递与按引用传递

c#对象按引用传递或按值传递

在Python中如何在转换为ctypes时引用函数字符串参数的值 c_wchar_p

如何在bash函数中的参数上使用按引用调用