Задать вопрос
ImmortalCAT
@ImmortalCAT
C# loving

В чём разница: возвращение метода?

Есть ли разница?
public object GetSomething()
{
           var key = ToDoSomething();
           return key;
}

и
public object GetSomething()
{
           return ToDoSomething();
}

ну вот примерно в таких случаях, какова разница???
UPD1!!!
Какая разница?
public Tuple<object,object> GetSomething()
{
           return new Tuple<object,object>( SomeDo(), SOmeDoing);
}

public object GetSomething(ref object k)
{
           k = SomeDo();
           return SomeDoing();
}

public object GetSomething(out int k)
{
           k = SomeDo();
           return SomeDoing();
}
  • Вопрос задан
  • 396 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
Rou1997
@Rou1997
По первому вопросу: компилятор все приведет к первому виду, на уровне MSIL в обоих случаях будет регистр (переменная), так что при выполнении разницы никакой, а вот при написании первый код более совершенен (расширяем), между var и return можно еще что-нибудь сделать с key.
По UPD: совсем разные куски кода, много различий, не понимаю, в чем вопрос.
Ответ написан
BuriK666
@BuriK666
Компьютерный псих
Думаю что никакой. Скорее всего компилятор оптимизирует все и приведет все ко второму варианту.
Ответ написан
Комментировать
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Исключительно для читаемости - именем переменной можно подчеркивать семантику вызова (в таком упрощенном виде ничего сказать нельзя). Но для алгоритма никакой разницы.
Ответ написан
Комментировать
AxisPod
@AxisPod
Компилятор C# код не оптимизирует, что вы пишите, то и получаете в итоге, если сложно ковырять MSIL, можно проверить декомпиляторами, они восстанавливают переменные в подобных методах. Оптимизация уже может производиться в JIT компиляторе. Но всё равно без необходимости лучше не писать лишнего кода.

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

На деле если хочется действительно знать что, как и почему, лучше почитать Рихтера.
Ответ написан
ImmortalCAT
@ImmortalCAT Автор вопроса
C# loving
Я пытался тестировать код
вот что получилось
/*ILCODE
        .method private hidebysig static string  GetString() cil managed
        {
            // Размер кода:       11 (0xb)
            .maxstack  1
            .locals init ([0] string V_0)
            IL_0000:  nop
            IL_0001:  ldstr      "MyString"
            IL_0006:  stloc.0
            IL_0007:  br.s       IL_0009
            IL_0009:  ldloc.0
            IL_000a:  ret
        } // end of method Program::GetString*/
        /* OILCODE
        .method private hidebysig static string  GetString() cil managed
        {
          // Размер кода:       6 (0x6)
          .maxstack  8
          IL_0000:  ldstr      "MyString"
          IL_0005:  ret
        } // end of method Program::GetString
        */
        private static string GetString()
        {
            return "MyString";
        }
        /*ILCODE
        .method private hidebysig static string  GetStringVar() cil managed
        {
          // Размер кода:       13 (0xd)
          .maxstack  1
          .locals init ([0] string str,
                   [1] string V_1)
          IL_0000:  nop
          IL_0001:  ldstr      "MyString"
          IL_0006:  stloc.0
          IL_0007:  ldloc.0
          IL_0008:  stloc.1
          IL_0009:  br.s       IL_000b
          IL_000b:  ldloc.1
          IL_000c:  ret
        } // end of method Program::GetStringVar 
        */
        /*OILCODE
        .method private hidebysig static string  GetStringVar() cil managed
        {
          // Размер кода:       8 (0x8)
          .maxstack  1
          .locals init ([0] string str)
          IL_0000:  ldstr      "MyString"
          IL_0005:  stloc.0
          IL_0006:  ldloc.0
          IL_0007:  ret
        } // end of method Program::GetStringVar
        */
        private static string GetStringVar()
        {
            var str = "MyString";
            return str;
        }
        /*ILCODE
        .method private hidebysig static object  GetObject() cil managed
        {
            // Размер кода:       11 (0xb)
            .maxstack  1
            .locals init ([0] object V_0)
            IL_0000:  nop
            IL_0001:  newobj     instance void [mscorlib]System.Object::.ctor()
            IL_0006:  stloc.0
            IL_0007:  br.s       IL_0009
            IL_0009:  ldloc.0
            IL_000a:  ret
        } // end of method Program::GetObject
        */
        /*OILCODE
        .method private hidebysig static object  GetObject() cil managed
        {
          // Размер кода:       6 (0x6)
          .maxstack  8
          IL_0000:  newobj     instance void [mscorlib]System.Object::.ctor()
          IL_0005:  ret
        } // end of method Program::GetObject
        */
        private static object GetObject()
        {
            return new object();
        }
        /*ILCODE
        .method private hidebysig static object  GetObjectVar() cil managed
        {
            // Размер кода:       13 (0xd)
            .maxstack  1
            .locals init ([0] object b,
                    [1] object V_1)
            IL_0000:  nop
            IL_0001:  newobj     instance void [mscorlib]System.Object::.ctor()
            IL_0006:  stloc.0
            IL_0007:  ldloc.0
            IL_0008:  stloc.1
            IL_0009:  br.s       IL_000b
            IL_000b:  ldloc.1
            IL_000c:  ret
        } // end of method Program::GetObjectVar
        */
        /*OILCODE
        .method private hidebysig static object  GetObjectVar() cil managed
        {
          // Размер кода:       8 (0x8)
          .maxstack  1
          .locals init ([0] object b)
          IL_0000:  newobj     instance void [mscorlib]System.Object::.ctor()
          IL_0005:  stloc.0
          IL_0006:  ldloc.0
          IL_0007:  ret
        } // end of method Program::GetObjectVar
        */
        private static object GetObjectVar()
        {
            var b = new object();
            return b;
        }

ILCODE - это IL Code из ILDASM
OILCODE - это IL Code из ILDASM с галочкой "Оптимизировать код"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы