В приведенном ниже примере программы демонстрируется применение неявно типизированных переменных. Он представляет собой вариант программы из предыду щего раздела, измененной таким образом, чтобы все переменные были типизированы неявно. // Продемонстрировать применение неявно типизированных переменных. 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.2М; // Ошибка! } }
Результат выполнения этой программы оказывается таким же, как и прежде.
Важно подчеркнуть, что неявно типизированная переменная по-прежнему остает ся строго типизированной. Обратите внимание на следующую закомментированную строку из приведенной выше программы. // s1 = 12.2М; // Ошибка!
Эта операция присваивания недействительна, поскольку переменная s1 относится к типу double. Следовательно, ей нельзя присвоить десятичное значение. Единствен ное отличие неявно типизированной переменной от обычной, явно типизированной переменной, — в способе определения ее типа. Как только этот тип будет определен, он закрепляется за переменной до конца ее существования. Это, в частности, означает, что тип переменной s1 не может быть изменен по ходу выполнения программы.
Неявно типизированные переменные внедрены в C# не для того, чтобы заменить собой обычные объявления переменных. Напротив, неявно типизированные перемен ные предназначены для особых случаев, и самый примечательный из них имеет отно шение к языку интегрированных запросов (LINQ), подробно рассматриваемому в главе
Таким образом, большинство объявлений переменных должно и впредь оставаться явно типизированными, поскольку они облегчают чтение и понимание исходного тек ста программы.
И последнее замечание: одновременно можно объявить только одну неявно типи зированную переменную. Поэтому объявление var s1 = 4.0, s2 = 5.0; // Ошибка!
является неверным и не может быть скомпилировано. Ведь в нем предпринимается попытка объявить обе переменные, s1 и s2, одновременно. Область действия и время существования переменных
Все переменные, использовавшиеся в предыдущих примерах программ, объяв лялись в самом начале метода Main. Но в C# локальную переменную разрешается объявлять в любом кодовом блоке. Как пояснялось в главе 2, кодовый блок начинает ся открывающей фигурной скобкой и оканчивается закрывающей фигурной скобкой. Этот блок и определяет область действия. Следовательно, всякий раз, когда начинается блок, образуется новая область действия. Прежде всего область действия определяет видимость имен отдельных элементов, в том числе и переменных, в других частях про граммы без дополнительного уточнения. Она определяет также время существования локальных переменных.
В C# к числу наиболее важных относятся области действия, определяемые классом и методом. Рассмотрение области действия класса (и объявляемых в ней переменных) придется отложить до того момента, когда в этой книге будут описываться классы. А до тех пор будут рассматриваться только те области действия, которые определяют ся методом иди же в самом методе.
Область действия, определяемая методом, начинается открывающей фигурной скобкой и оканчивается закрывающей фигурной скобкой. Но если у этого метода име ются параметры, то и они входят в область действия, определяемую данным методом.
Как правило, локальные переменные объявляются в области действия, невидимой для кода, находящегося вне этой области. Поэтому, объявляя переменную в опреде ленной области действия, вы тем самым защищаете ее от доступа иди видоизменения вне данной области. Разумеется, правила области действия служат основанием для ин капсуляции.
Области действия могут быть вложенными. Например, всякий раз, когда создается кодовый блок, одновременно образуется и новая, вложенная область действия. В этом случае внешняя область действия охватывает внутреннюю область. Это означает, что локальные переменные, объявленные во внешней области действия, будут видимы для кода во внутренней области действия. Но обратное не справедливо: локальные перемен ные, объявленные во внутренней области действия, не будут видимы вне этой области.