Наказаний нет вообще. Перед эффективной компиляцией компилятор заменяет var на соответствующий тип во время компиляции. Чтобы быть более правдоподобным, я даже сделал небольшое приложение, чтобы продемонстрировать это с помощью рефлектора экс-Лутца Редера, теперь рефлектора Red Gate:
Версия 1:
Код:
namespace ConsoleApplication28
{
class Program
{
static void Main(string[] args)
{
var p = new Person("Andrei Rinea");
System.Console.WriteLine(p);
}
}
class Person
{
private string _name;
public Person(string name) { _name = name; }
public override string ToString() { return _name; }
}
}
CIL генерируется (CIL означает общий промежуточный язык ... вроде как байт-код Java):
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] class ConsoleApplication28.Person p)
L_0000: nop
L_0001: ldstr "Andrei Rinea"
L_0006: newobj instance void ConsoleApplication28.Person::.ctor(string)
L_000b: stloc.0
L_000c: ldloc.0
L_000d: call void [mscorlib]System.Console::WriteLine(object)
L_0012: nop
L_0013: ret
}
Версия 2 (обратите внимание на замену «Var» на «Person» в строке 7 фрагмента кода)
Код:
namespace ConsoleApplication28
{
class Program
{
static void Main(string[] args)
{
Person p = new Person("Andrei Rinea");
System.Console.WriteLine(p);
}
}
class Person
{
private string _name;
public Person(string name) { _name = name; }
public override string ToString() { return _name; }
}
}
CIL генерируется
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] class ConsoleApplication28.Person p)
L_0000: nop
L_0001: ldstr "Andrei Rinea"
L_0006: newobj instance void ConsoleApplication28.Person::.ctor(string)
L_000b: stloc.0
L_000c: ldloc.0
L_000d: call void [mscorlib]System.Console::WriteLine(object)
L_0012: nop
L_0013: ret
}
Абсолютно нет разницы в сгенерированном CIL!
Вот и все, что имеет значение;)
Редактировать 1: Это было скомпилировано в режиме отладки ... в выпуске Release nop'ов там не будет ...;)