Мой босс запрещает мне использовать var
, так как это вызовет бокс и замедлит работу приложения.
Это правда?
Подход, который может сработать, - написать эти два метода:
public static void WithInt()
{
int x = 5;
Console.WriteLine(x);
}
public static void WithVar()
{
var x = 5;
Console.WriteLine(x);
}
Компилировать и использовать ildasm
для проверки произведен CIL. Покажи своему боссу.
Следуя ответу Аакаша, вот 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
Это совсем не так.
var
просто означает "уважаемый компилятор, я знаю, что это за тип, и вы тоже, так что давайте просто двигаться дальше, не так ли?"
Это делает код короче, и некоторые находят это более читабельным (другие считают его менее читаемым), но при этом производительность не снижается.
Возможно, ваш начальник — старый программист Visual Basic (как в <= 6.0), привыкший к типу VARIANT
. Если вы не указали тип вашей переменной явно в своем операторе DIM
, это был VARIANT
, который является своего рода union
, если я правильно помню. Вы можете рассматривать это как своего рода «упаковку» и «распаковку» при передаче таких переменных в функции.
Иногда люди путаются. Спросите своего начальника о его военных историях на Visual Basic. Слушайте, учитесь и зарабатывайте симпатию одновременно! Выходя из офиса, вы могли бы указать, что компилятор С# вычисляет эти вещи во время компиляции и что «упаковка» больше не является проблемой.
Не ждите, что вашему начальнику придется следить за последними изменениями в языках/API. Это не о том, чтобы быть тупым. Это о том, чтобы иметь другие вещи, чтобы сделать. Его работа, например.
Редактировать: Однако, как отмечено в комментариях ниже, говорить вам не использовать var
по неправильным причинам, вероятно, не его работа...
Почему так много людей проклинают тупых боссов? Революция, братья!
Ваш начальник должен прочитать документацию. var
заставляет компилятор определить тип переменной, просматривая статический тип выражения инициализации. Во время выполнения не имеет ни малейшего значения, указываете ли вы тип вручную или используете var
и позволяете компилятору понять это за вас.
Обновление В комментарии под вопросом Ханс Пассант спрашивает
можете ли вы придумать какой-нибудь инициализатор var который вызывает бокс без использования cast?
Примером самостоятельного выражения, вызывающего такое преобразование, является:
var boxedInt = new Func<int, object>(n => n)(5);
Но это просто идентично:
object boxedInt = new Func<int, object>(n => n)(5);
Другими словами, это не имеет ничего общего с переменная
. Результатом моего выражения инициализатора является object
, поэтому var
должен использовать это как тип переменной. Это не могло быть ничем другим.