Штраф за производительность (если есть) при использовании декларации 'var' в C # 3.0+ - PullRequest
3 голосов
/ 20 января 2009

Есть ли снижение производительности при использовании объявления var в c # 3.0+? Решарпер постоянно настаивает на том, чтобы я использовал его свободно, и я хочу знать, есть ли у него какие-либо недостатки.

Ответы [ 4 ]

11 голосов
/ 20 января 2009

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

Есть ли недостатки, это другая история.

3 голосов
/ 20 января 2009

Нет, нет. Сгенерированный код IL точно такой же. Выгода - более читаемый исходный код (в большинстве случаев в любом случае).

См. Также этот вопрос .

3 голосов
/ 20 января 2009

Производительность не снижается, поскольку вывод типа выполняется во время компиляции. Тем не менее, это может усложнить выполнение кода из-за отсутствия явной типизации.

2 голосов
/ 21 января 2009

Наказаний нет вообще. Перед эффективной компиляцией компилятор заменяет 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'ов там не будет ...;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...