首页 > 解决方案 > 运行时 ref 和 out 有何不同?

问题描述

在他们给出的许多文章中,它们refout相同的方式工作。即使在编译时以相同的方式识别两者,但它们在运行时(CLR)是不同的。谁能解释它是如何不同的?和功能呢?

我在这段代码中尝试了同样的方法

public static void Main()
    {
        int par = 7;
        Program x= new Program();
        x.RefMethod(out par);
        Console.WriteLine(par);
        x.RefMethod1(ref par);
        Console.WriteLine(par);

        Console.ReadLine();
    }
    public void RefMethod(out int i)
    {
        i = 10;

    }
    public void RefMethod1(ref int i)
    {
        i = 20;
    }

refmethod 的 ILDASM:

method public hidebysig instance void  RefMethod([out] int32& i) cil managed
{
  // Code size       6 (0x6)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.1
  IL_0002:  ldc.i4.s   10
  IL_0004:  stind.i4
  IL_0005:  ret
} // end of method Program::RefMethod

Refmethod1 的 ILDASM:

method public hidebysig instance void  RefMethod1(int32& i) cil managed
{
  // Code size       6 (0x6)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldarg.1
  IL_0002:  ldc.i4.s   20
  IL_0004:  stind.i4
  IL_0005:  ret
} // end of method Program::RefMethod1

以上清楚地表明两者在某一点上是不同的,即在该方法初始化时。请任何人都可以帮助我解决我的问题吗?

请任何人清楚地回答这个问题。我仍然没有得到答案:(

标签: c#refout

解决方案


ref 和 out 之间的区别不在于 CLR,而在于 C# 语言本身。Ref 和 Out 的不同之处在于它们每个的“编译器需要不同的行为”。编译时也不允许方法重载。

正如您从代码中看到的,唯一的变化是地址引用,特别是这一行(如果您输入值 10,这将上升为 10)。

IL_0002:  ldc.i4.s   20

推荐阅读