Добавить в цитаты Настройки чтения

Страница 25 из 502

<b>    double s2 = 5.0;</b>

<b>    // Инициализировать переменную hypot динамически, </b>

<b>    double hypot = Math.Sqrt( (s1 * s1) + (s2 * s2) );</b>

<b>    Console.Write(&quot;Гипотенуза треугольника со сторонами &quot;</b>

<b>             + s1 + &quot; и &quot; + s2 + &quot; равна &quot;);</b>

<b>    Console.WriteLine(&quot;{0:#.###}.&quot;, hypot);</b>

<b>  }</b>

<b>}</b>

Результат выполнения этой программы выглядит следующим образом.

<b>Гипотенуза треугольника со сторонами 4 и 5 равна 6.403</b>

В данном примере объявляются три локальные переменные: s1, s2 и hypot. Две из них (s1 и s2) инициализируются константами, А третья (hypot) динамически инициализируется вычисляемой длиной гипотенузы. Для такой инициализации используется выражение, указываемое в вызываемом методе Math.Sqrt(). Как пояснялось выше, для динамической инициализации пригодно любое выражение, действительное на момент объявления переменной. А поскольку вызов метода Math.Sqrt() (или любого другого библиотечного метода) является действительным на данный момент, то его можно использовать для инициализации переменной hypot. Следует особо подчеркнуть, что в выражении для инициализации можно использовать любой элемент, действительный на момент самой инициализации переменной, в том числе вызовы методов, другие переменные или литералы.

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

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

<b>var е = 2.7183;</b>

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

<b>var е = 2.7183F;</b>

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

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

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

<b>using System;</b>

<b>class ImplicitlyTypedVar { </b>

<b>  static void Main() {</b>

<b>    //Эти переменные типизированы неявно. Они отнесены </b>

<b>    // к типу double, поскольку инициализирующие их </b>

<b>    // выражения сами относятся к типу double, </b>

<b>    var s1 = 4.0; </b>

<b>    var s2 = 5.0;</b>

<b>    //Итак, переменная hypot типизирована неявно и </b>

<b>    // относится к типу double, поскольку результат,</b>

<b>    // возвращаемый методом Sqrt(), имеет тип double, </b>

<b>    var hypot = Math.Sqrt((s1 * s1) + (s2 * s2));</b>

<b>    Console.Write(&quot;Гипотенуза треугольника со сторонами &quot;</b>

<b>             + s1 + &quot; by &quot; + s2 + &quot; равна &quot;);</b>

<b>    Console.WriteLine(&quot;{0:#.###}.&quot;, hypot);</b>

<b>    // Следующий оператор не может быть скомпилирован,</b>

<b>    // поскольку переменная s1 имеет тип double и </b>

<b>    // ей нельзя присвоить десятичное значение.</b>

<b>    // s1 = 12.2М; // Ошибка!</b>

<b>  }</b>

<b>}</b>

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

<b>// s1 = 12.2М; // Ошибка!</b>

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

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

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

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

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

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

Все переменные, использовавшиеся в предыдущих примерах программ, объявлялись в самом начале метода Main(). Но в C# локальную переменную разрешается объявлять в любом кодовом блоке. Как пояснялось в главе 2, кодовый блок начинается открывающей фигурной скобкой и оканчивается закрывающей фигурной скобкой. Этот блок и определяет область действия. Следовательно, всякий раз, когда начинается блок, образуется новая область действия. Прежде всего область действия определяет видимость имен отдельных элементов, в том числе и переменных, в других частях программы без дополнительного уточнения. Она определяет также время существования локальных переменных.