Материал предоставлен https://it.rfei.ru

Неявно типизированные переменные

Как пояснялось выше, все переменные в C# должны быть объявлены. Как правило, при объявлении переменной сначала указывается тип, например int или bool, а затем имя переменной. Но начиная с версии C# 3.0, компилятору предоставляется возможность самому определить тип локальной переменной, исходя из значения, которым она инициализируется. Такая переменная называется неявно типизированной.

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

var e = 2.7183;

В данном примере переменная e инициализируется литералом с плавающей точкой, который по умолчанию имеет тип double, и поэтому она относится к типу double. Если бы переменная e была объявлена следующим образом:

var e = 2.7183F;

то она была бы отнесена к типу float.

В приведенном ниже примере программы демонстрируется применение неявно типизированных переменных. Он представляет собой вариант программы из предыдущего раздела, измененной таким образом, чтобы все переменные были типизированы неявно.

// Продемонстрировать применение неявно типизированных переменных,

using System;

class ImplicitlyTypedVar {
  static void Main() {
    // Эти переменные типизированы неявно. Они отнесены
    // к типу double,  поскольку инициализирующие их
    // выражения сами относятся к типу double,
    var s1 = 4.0;
    var s2 = 5.0;

    // Итак, переменная hypot типизирована неявно и
    // относится к типу double, поскольку результат,
    // возвращаемый методом Sqrt(),  имеет тип double,
    var hypot = Math.Sqrt((s1 * s1) + (s2 * s2));

    Console.Write("Гипотенуза треугольника со сторонами " +
    s1 + " by " + s2 + " равна ");

    Console.WriteLine("{0:#.###}.", hypot);

    // Следующий оператор не может быть скомпилирован.
    // поскольку переменная s1 имеет тип double и
    // ей нельзя присвоить десятичное значение.
    // s1 = 12.2M;  // Ошибка!
  }
}

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

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

// s1 = 12.2M; // Ошибка!

Эта операция присваивания недействительна, поскольку переменная s1 относится к типу double. Следовательно, ей нельзя присвоить десятичное значение. Единственное отличие неявно типизированной переменной от обычной, явно типизированной переменной, — в способе определения ее типа. Как только этот тип будет определен, он закрепляется за переменной до конца ее существования. Это, в частности, означает, что тип переменной s1 не может быть изменен по ходу выполнения программы.

Неявно типизированные переменные внедрены в C# не для того, чтобы заменить собой обычные объявления переменных. Напротив, неявно типизированные переменные предназначены для особых случаев, и самый примечательный из них имеет отношение к языку интегрированных запросов (LINQ), подробно рассматриваемому в главе LINQ. Таким образом, большинство объявлений переменных должно и впредь оставаться явно типизированными, поскольку они облегчают чтение и понимание исходного текста программы.

И последнее замечание: одновременно можно объявить только одну неявно типизированную переменную. Поэтому объявление

var s1 = 4.0, s2 = 5.0; // Ошибка!

является неверным и не может быть скомпилировано. Ведь в нем предпринимается попытка объявить обе переменные, s1 и s2, одновременно.

Динамическая инициализацияОбласть действия и время существования переменных