Г. Шилдт - С#4.0 Полное руководство (1160795), страница 16
Текст из файла (страница 16)
54(гб () . Как пояснялось выше, для динамической инициализации пригодно любое выражение, действительное на момент объявления переменной. А поскольку вызов метода МаЬЬ. 54(гс () (или любого другого библиотечного метода) является действительным на данный момент, то Глава 3.
Типы данных, литералы и переменные 88 его можно использовать для инициализации переменной Ьурос. Следует особо подчеркнуть, что в выражении для инициализации можно использовать любой элемент, действительный на момент самой инициализации переменной, в том числе вызовы методов, другие переменные или литералы. Непвнотипизированные переменные Как пояснялось выше, все переменные в С() должны быть объявлены.
Как правило, при объявлении переменной сначала указывается тип, например 1пс или Ьоо1, а затем имя переменной. Но начиная с версии С() 3.0, компилятору предоставляется возможность самому определить тип локальной переменной, исходя из значения, которым она инициализируется.
Такая переменная называется неявно л)ипизированнои1 Неявно типизированная переменная объявляется с помощью ключевого слова час и должна быть непременно инициализирована. Для определения типа этой переменной компилятору служит тип ее инициализатора, т.е. значения, которым она инициализируется. рассмотрим такой пример. чаг е = 2.7183; В данном примере переменная е инициализируется литералом с плавающей точкой, который по умолчанию имеет тип с(оцЬ1е, и поэтому она относится к типу боцЬ1е. Если бы переменная е была объявлена следующим образом: чаг е = 2.718ЗГ; то она была бы отнесена к типу (1оас.
В приведенном ниже примере программы демонстрируется применение неявно типизированных переменных. Он представляет собой вариант программы из предыдущего раздела, измененной таким образом, чтобы все переменные были типизированы неявно. Продемонстрировать применение неявно типизированных переменных. ца1пэ зувсет; с1ава 1юр1гсгг1утуребчаг ( асасгс чогб Маги() ( Эти переменные типизированы неявно. Они отнесены // к типу боцЬ1е, поскольку инициализирующие их 2/ выражения сами относятся к типу боцЫе. чаг в1 = 4.0( чаг я2 = 5.0; итак, переменная Ьурог типизирована неявно и // относится к типу боцЫе, поскольку результат, возвращаемый методом 5Чгс(), имеет тип СоцЬ1е.
чаг ьурог = мать.зчгг( (я1 * а1) + (в2 * я2) ); Сопво1е.нггсе("Гипотенуза треугольника со сторонами " в1 + " Ьу " т в2 в " равна "); Сопво1е.иггсеььпе("(О:().()()$).", Ьурог)," // Следующий оператор не может быть скомпилирован, 86 Часть ). язык С)) поскольку переменная з1 имеет тип я)онЬ1е и 22 ей нельзя присвоить десятичное значение. з1 = 12.2М; // Ошибка! ) ) Результат выполнения этой программы оказывается таким же, как и прежде. Важно подчеркнуть, что неявно типизированная переменная по-прежнему остается строго типизированной. Обратите внимание на следующую закомментированную строку из приведенной выше программы.
/) з1 = 12.2Мг // Ошибка! Эта операция присваивания недействительна, поскольку переменная з1 относится к типу с)опЫе. Следовательно, ей нельзя присвоить десятичное значение. Единственное отличие неявно типизированной переменной от обычной, явно типизированной переменной, — в способе определения ее типа. Как только этот тип будет определен, он закрепляется за переменной до конца ее существования. Это, в частности, означает, что тип переменнои з1 не может быть изменен по ходу выполнения программы.
Неявно типизированные переменные внедрены в С)) не для того, чтобы заменить собой обычные объявления переменных. Напротив, неявно типизированные переменные предназначены для особых случаев, и самый примечательный из них имеет отношение к языку интегрированных запросов (11)х)Я), подробно рассматриваемому в главе 19. Таким образом, большинство объявлений переменных должно и впредь оставаться явно типизированными, поскольку они облегчают чтение и понимание исходного текста программы.
И последнее замечание: одновременно можно объявить только одну неявно типизированную переменную. Поэтому объявление чаг з1 = 4.0, з2 = 5.0; // Ошибка! является неверным и не может быть скомпилировано. Ведь в нем предпринимается попытка объявить обе переменные, з1 и з2, одновременно. Область действия и время существования переменных Все переменные, использовавшиеся в предыдущих примерах программ, объявлялись в самом начале метода Маъп () .
Но в С)) локальную переменную разрешается объявлять в любом кодовом блоке. Как пояснялось в главе 2, кодовый блок начинается открывающей фигурной скобкой и оканчивается закрывающей фигурной скобкой. Этот блок и определяет область деисглвия. Следовательно, всякий раз, когда начинается блок, образуется новая область действия. Прежде всего область действия определяет видимость имен отдельных элементов, в том числе и переменных, в других частях программы без дополнительного уточнения.
Она определяет также время существования локальных переменных. В С)) к числу наиболее важных относятся области действия, определяемые классом и методом. Рассмотрение области действия класса (и объявляемых в ней переменных) придется отложить до того момента, когда в этой книге будут описываться классы. А до тех пор будут рассматриваться только те области действия, которые определяются методом или же в самом методе. Глава 3. Типы данных, литералы и переменные 87 Область действия, определяемая методом, начинается открывающей фигурной скобкой и оканчивается закрывающей фигурной скобкой. Но если у этого метода имеются параметры, то и они входят в область действия, определяемую данным методом. Как правило, локальные переменные объявляются в области действия, невидимой для кода, находящегося вне этой области. Поэтому, объявляя переменную в определенной области действия, вы тем самым защищаете ее от доступа или видоизменения вне данной области.
Разумеется, правила области действия служат основанием для инкапсуляции. Области действия могут быть вложенными. Например, всякий раз, когда создается кодовый блок, одновременно образуется и новая, вложенная область действия. В этом случае внешняя область действия охватывает внутреннюю область.
Это означает, что локальные переменные, объявленные во внешней области действия, будут видимы для кода во внутренней области действия. Но обратное не справедливо: локальные переменные, объявленные во внутренней области действия, не будут видимы вне этой области. Для того чтобы стала более понятной сущность вложенных областей действия, рассмотрим следующий пример программы.
Продемонстрировать область действия кодового блока. пз1по Яузгеш; с1азз ЯоореОешо ( зпапьо чолс) Наьп() ( гпс хг уг эта переменная доступна для всего кода внутри метода Маьп() х = 101 ЬГ(х == 10) ( // начать новую область действия гпс у = 20; // Эта переменная доступна только в данном кодовом блоке. Здесь доступны обе переменные, х и у, Сопзо1е.иггпеЬ1пе("х и у: " + х ь " " + у); х = у * 21 ) у = 100; /l Ошибка! Переменна у здесь недоступна. Л переменная х здесь по-прежнему доступна.
Сопзо1е.нггсеЬЬпе("х равно " ь х); Как поясняется в комментариях к приведенной выше программе, переменная х объявляется в начале области действия метода маап (), и поэтому она доступна для всего последующего кода в пределах этого метода. В блоке условного оператора ЬГ объявляется переменная у. А поскольку этот кодовый блок определяет свою собственную область действия, то переменная у видима только для кода в пределах данного блока.
Именно поэтому строка 11пе у = 1001, находящаяся за пределами этого блока, закомментирована. Если удалить находящиеся перед ней символы комментария (//), то во время компиляции программы произойдет ошибка, поскольку переменная у невидима за пределами своего кодового блока. В то же время переменная х может использоваться в блоке условного оператора Ьй, поскольку коду из этого блока, 88 Часть (. Язык С(г находящемуся во вложенной области действия, доступны переменные, объявленные в охватывающей его внешней области действия. Переменные могут быть обьявлены в любом месте кодового блока, но они становятся действительными только после своего объявления. Так, если объявить переменную в начале метода, то она будет доступна для всего остального кода в пределах этого метода.