1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 14
Текст из файла (страница 14)
Обратите также внимание на то, как в выводимых строкахобеспечивается наличие двойных кавычек (с помощью ESC-последовательности \").Помимо формы только что описанного строкового литерала можно также определитьбуквальный (verbatim) строковый литерал. Буквальный строковый литерал начинается ссимвола @, за которым следует строка, заключенная в кавычки. Содержимое строки вкавычках принимается без какой бы то ни было модификации и может занимать две илиболее строк. Таким образом, можно переходить на новую строку, использовать табуляцию ипр., не прибегая к помощи управляющих последовательностей. Единственное исключениесоставляет двойная кавычка ("). Чтобы получить в выходных данных двойную кавычку, вбуквальном строковом литерале необходимо использовать две подряд двойные кавычки(""). А теперь обратимся к программе, в которой демонстрируется использованиебуквального строкового литерала.// Демонстрация буквальных строковых литералов.using System;class Verbatim {public static void Main() {Console.WriteLine(@"Это буквальныйстроковый литерал,который занимает несколько строк.");Console.WriteLine(@"А теперь воспользуемся табуляцией:1 2 345 6 78");Console.WriteLine(@"Отзыв программиста: ""Мне нравится C#.""");}}Вот что сгенерирует эта программа:Глава 3.
Типы данных, литералы и переменные67Это буквальныйстроковый литерал,который занимает несколько строкА теперь воспользуемся табуляцией:12345678Отзыв программиста: "Мне нравится C#."Здесь важно отметить, что буквальные строковые литералы отображаются точно так,как они введены в программе. Они позволяют программисту так формировать выходныеданные, как они будут отображены на экране. Но в случае многострочного вывода переходна следующую строку нарушит систему формирования отступов в программе. Поэтомубуквальные строковые литералы не слишком часто используются в программах этой книги,хотя во многих случаях форматирования данных они оказываются хорошим подспорьем.И последнее.
Не путайте строки с символами. Символьный литерал (например, 'X')представляет одиночную букву типа char. А строка, хотя и содержащая всего одну букву(например, “X”), это все-таки строка.Рассмотрим переменные поближеКак вы узнали в главе 2, для объявления переменной необходимо использоватьинструкцию следующего формата:тип имя_переменной;Здесь с помощью элемента тип задается тип объявляемой переменной, а с помощьюэлемента имя_переменной — ее имя. Можно объявить переменную любого допустимоготипа. При создании переменной создается экземпляр соответствующего типа.
Такимобразом, возможности переменной определяются ее типом. Например, переменную типаbool нельзя использовать для хранения значений с плавающей точкой. Более того, типпеременной невозможно изменить во время ее существования. Например, переменную типаint нельзя преобразовать в переменную типа char.Все переменные в C# должны быть объявлены до их использования. Это —требование компилятора, поскольку, прежде чем скомпилировать надлежащим образоминструкцию, в которой используется переменная, он должен “знать” тип содержащейся вней информации.
“Знание” типа также позволяет C# осуществлять строгий контроль типов.Помимо типов переменные различаются и другими качествами. Например,переменные, которые мы использовали в примерах программ до сих пор, называютсялокальными, поскольку они объявляются внутри метода.Инициализация переменнойПеременная до использования должна получить значение. Это можно сделать спомощью инструкции присваивания. Можно также присвоить переменной начальноезначение одновременно с ее объявлением.
Для этого достаточно после имени переменнойпоставить знак равенства и указать присваиваемое значение. Общий формат инициализациипеременной имеет такой вид:тип имя_переменной = значение;68Часть I. Язык C#Здесь, как нетрудно догадаться, элемент значение — это начальное значение,которая получает переменная при создании.
Значение инициализации должносоответствовать заданному типу переменной.Вот несколько примеров:int count = 10; // Присваиваем переменной count// начальное значение 10.char ch = 'X'; // Инициализируем ch буквой X.float f = 1.2F // Переменная f инициализируется// числом 1.2.При объявлении двух или более переменных одного типа с помощью списка (сразделением элементов списка запятыми) одной или нескольким из этих переменныхможно присвоить начальные значения.
Например, в инструкцииint a, b = 8, c = 19, d;//Переменные b и c// инициализируются числами.Динамическая инициализацияХотя в предыдущих примерах в качестве инициализаторов были использованытолько константы, C# позволяет инициализировать переменные динамически, с помощьюлюбого выражения, действительного на момент объявления переменной. Рассмотрим,например, короткую программу, которая вычисляет гипотенузу прямоугольноготреугольника, заданного длинами двух противоположных сторон.// Демонстрация динамической инициализации.using System;class DynInit {public static void Main() {double s1 = 4.0, s2 = 5.0; // Длины сторон.// Динамически инициализируем переменную hypot.double hypot = Math.Sqrt((s1 * s1) + (s2 * s2));}}Console.Write("Гипотенуза треугольника со сторонами " +s1 + " и " + s2 + " равна ");Console.WriteLine("{0:#.###}.", hypot);Результат выполнения этой программы имеет такой вид:Гипотенуза треугольника со сторонами 4 и 5 равна 6,403.Здесь объявлены три локальные переменные: s1, s2 и hypot.
Первые две (s1 и s2)инициализируются константами, а третья, hypot, инициализируется динамическирезультатом вычисления гипотенузы по двум катетам. Обратите внимание на то, чтоинициализация включает вызов метода Math.Sqrt(). Как уже было сказано, дляинициализации переменной можно использовать любое выражение, действительное намомент ее объявления. Поскольку вызов метода Math.Sqrt() (как и любого другогобиблиотечного метода) действителен в этой точке программы, его вполне можноиспользовать для инициализации переменной hypot. Здесь важно то, что в выраженииинициализации можно использовать любой элемент, действительный на моментинициализации, включая вызовы методов, другие переменные или литералы.Глава 3. Типы данных, литералы и переменные69Область видимости и время существованияпеременныхДо сих пор все переменные, с которыми мы имели дело, объявлялись в начале методаMain().
Однако в C# разрешается объявлять переменные внутри любого блока. Блокначинается открывающей, а завершается закрывающей фигурными скобками. Любой блокопределяет область объявления, или область видимости (scope) объектов. Таким образом,при создании блока создается и новая область видимости, которая определяет, какиеобъекты видимы для других частей программы. Область видимости также определяет времясуществования этих объектов.Самыми важными в C# являются области видимости, которые определены классом иметодом.
Область видимости класса (и переменные, объявленные внутри нее) мырассмотрим позже, когда доберемся до описания классов, а пока затронем областивидимости, определяемые методами.Область видимости, определяемая методом, начинается с открывающей фигурнойскобки. Но если метод имеет параметры, они также относятся к области видимости метода.Как правило, переменные, объявленные в некоторой области видимости, невидимы(т.е. недоступны) для кода, который определяется вне этой области видимости. Такимобразом, при объявлении переменной внутри области видимости вы локализируете ее изащищаете от неправомочного доступа и/или модификации. Эти правила областивидимости обеспечивают основу для инкапсуляции.Области видимости могут быть вложенными. Например, при каждом созданиипрограммного блока создается новая вложенная область видимости.
В этом случае внешняяобласть включает внутреннюю. Это означает, что объекты, объявленные внутри внешнейобласти, будут видимы для кода внутренней области. Но обратное утверждение неверно:объекты, объявленные во внутренней области, невидимы вне ее.Чтобы лучше понять суть вложенных областей видимости, рассмотрим следующуюпрограмму:// Демонстрация области видимости блока.using System;class ScopeDemo {}70public static void Main() {int x; // Переменная x известна всему коду в пределах// метода Main().x = 10;if(x == 10) { // Начало новой области видимости.int y = 20; // Переменная y известна только// этому блоку.// Здесь известны обе переменные x и y.Console.WriteLine("x и y: " + x + " " + y);x = y * 2;}// y = 100; // Ошибка! Переменная y здесь неизвестна.// Переменная x здесь известна.Console.WriteLine("Значение x равно " + x);}Часть I.
Язык C#Как утверждается в комментариях, переменная x объявляется в начале областивидимости метода Main() и потому доступна всему последующему коду метода. Внутриблока инструкции if объявляется переменная y. А поскольку блок определяет областьвидимости, то переменная y видима только коду внутри этого блока.
Поэтому, находясь внеэтого блока, программная строка// y = 100; //Ошибка! Переменная y здесь неизвестна.оформлена как комментарий. Если убрать символ комментария, компилятор выдастсообщение об ошибке, поскольку переменная y невидима вне if-блока. Переменную xможно свободно использовать и внутри if-блока, поскольку внутренний код этого блока(т.е. код во вложенной области видимости) имеет доступ к переменным, объявленным внеего.Внутри блока переменные можно объявлять в любой точке, но действительными онистановятся только после объявления. Таким образом, если объявить переменную в началеметода, она будет доступна всему коду этого метода.