как ref и out отличаются во время выполнения? - PullRequest
0 голосов
/ 17 января 2019

во многих из статей, которые они дали, что ref и out работают одинаково. Даже во время компиляции распознает оба одинаково, но они отличаются во время выполнения (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;
    }

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

ILDASM для Refmethod1:

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

вышеизложенное ясно показывает, что оба они отличаются в одном месте, то есть при инициализации этого метода. Пожалуйста, кто-нибудь может мне помочь с моим вопросом?

Пожалуйста, ответьте на вопрос с ясностью. Я до сих пор не получил ответ: (

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Примечание: Этот ответ ссылается на вводящую в заблуждение документацию MSDN, с тех пор как было исправлено .


Ответ Гауравсы правильный. Разницы во времени выполнения нет.

Вы упомянули https://www.c -sharpcorner.com / UploadFile / ff2f08 / ref-vs-out-Keywords-in-C-Sharp / , в котором говорится:

И ref, и out обрабатываются по-разному во время выполнения, и они обрабатываются одинаково во время компиляции, поэтому методы не могут быть перегружены, если один метод принимает аргумент как ref, а другой принимает аргумент как выход.

Автор этой статьи, скорее всего, прочитал https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier, в котором говорится:

Хотя ключевые слова in, ref и out вызывают разное время выполнения поведение, они не считаются частью сигнатуры метода в время компиляции. Поэтому методы не могут быть перегружены, если только Разница в том, что один метод принимает ссылку или аргумент, а другой принимает аргумент вне.

Лично я согласен с jmoreno , который утверждает, что в MSDN следовало использовать фразу «требовать другого поведения» вместо «вызывать различие в поведении».

Не удивительно, что вы видите такое объяснение в нескольких местах. Вероятно, многие авторы, которые пытаются использовать документацию Microsoft в качестве основного источника информации, приводят такое же вводящее в заблуждение объяснение.

0 голосов
/ 18 января 2019

Разница между ref и out заключается не в CLR, а в самом языке C #. Ref и Out отличаются тем, что «компилятору требуется разное поведение» для каждого из них. Перегрузка метода также не допускается во время компиляции.

Как видно из кода, единственное изменение - это адресная ссылка, в частности, в этой строке (если вы установите значение 10, это будет равно 10).

IL_0002:  ldc.i4.s   20
...