Ключевое слово var в C # вызывает бокс?

Мой босс запрещает мне использовать var , так как это вызовет бокс и замедлит работу приложения.

Это правда?

38
задан nawfal 15 July 2014 в 14:15
поделиться

5 ответов

Подход, который может сработать, - написать эти два метода:

public static void WithInt()
{
    int x = 5;
    Console.WriteLine(x);
}

public static void WithVar()
{
    var x = 5;
    Console.WriteLine(x);
}

Компилировать и использовать ildasm для проверки произведен CIL. Покажи своему боссу.

edit @ck сделал за вас все, кроме последнего шага :)

52
ответ дан 27 November 2019 в 02:59
поделиться

Следуя ответу Аакаша, вот IL: (спасибо LINQPad)

WithInt:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret         

WithVar:
IL_0000:  ldc.i4.5    
IL_0001:  stloc.0     
IL_0002:  ldloc.0     
IL_0003:  call        System.Console.WriteLine
IL_0008:  ret      
37
ответ дан 27 November 2019 в 02:59
поделиться

Это совсем не так.

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

Это делает код короче, и некоторые находят это более читабельным (другие считают его менее читаемым), но при этом производительность не снижается.

32
ответ дан 27 November 2019 в 02:59
поделиться

Возможно, ваш начальник — старый программист Visual Basic (как в <= 6.0), привыкший к типу VARIANT. Если вы не указали тип вашей переменной явно в своем операторе DIM, это был VARIANT, который является своего рода union, если я правильно помню. Вы можете рассматривать это как своего рода «упаковку» и «распаковку» при передаче таких переменных в функции.

Иногда люди путаются. Спросите своего начальника о его военных историях на Visual Basic. Слушайте, учитесь и зарабатывайте симпатию одновременно! Выходя из офиса, вы могли бы указать, что компилятор С# вычисляет эти вещи во время компиляции и что «упаковка» больше не является проблемой.

Не ждите, что вашему начальнику придется следить за последними изменениями в языках/API. Это не о том, чтобы быть тупым. Это о том, чтобы иметь другие вещи, чтобы сделать. Его работа, например.

Редактировать: Однако, как отмечено в комментариях ниже, говорить вам не использовать var по неправильным причинам, вероятно, не его работа...

10
ответ дан 27 November 2019 в 02:59
поделиться

Почему так много людей проклинают тупых боссов? Революция, братья!

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

Обновление В комментарии под вопросом Ханс Пассант спрашивает

можете ли вы придумать какой-нибудь инициализатор var который вызывает бокс без использования cast?

Примером самостоятельного выражения, вызывающего такое преобразование, является:

var boxedInt = new Func<int, object>(n => n)(5);

Но это просто идентично:

object boxedInt = new Func<int, object>(n => n)(5);

Другими словами, это не имеет ничего общего с переменная. Результатом моего выражения инициализатора является object, поэтому var должен использовать это как тип переменной. Это не могло быть ничем другим.

32
ответ дан 27 November 2019 в 02:59
поделиться
Другие вопросы по тегам:

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