Текст книги "Полное руководство. С# 4.0"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 3 (всего у книги 58 страниц)
В приведенной ниже программе создаются две переменные – х и у. // Эта программа демонстрирует применение переменных. using System; class Example2 { static void Main() { int x; // здесь объявляется переменная int у; // здесь объявляется еще одна переменная х = 100; // здесь переменной х присваивается значение 100 Console.WriteLine("х содержит " + х); у = х / 2; Console.Write("у содержит х / 2: "); Console.WriteLine(y); } }
Выполнение этой программы дает следующий результат. х содержит 100 у содержит х / 2: 50
В этой программе вводится ряд новых понятий. Прежде всего, в операторе int х; // здесь объявляется переменная
объявляется переменная целочисленного типа с именем х. В C# все переменные долж ны объявляться до их применения. Кроме того, нужно обязательно указать тип зна чения, которое будет храниться в переменной. Это так называемый тип переменной. В данном примере в переменной х хранится целочисленное значение, т.е. целое число. Для объявления в C# переменной целочисленного типа перед ее именем указывает ся ключевое слово int. Таким образом, в приведенном выше операторе объявляется переменная х типа int.
В следующей строке объявляется вторая переменная с именем у. int у; // здесь объявляется еще одна переменная
Как видите, эта переменная объявляется таким же образом, как и предыдущая, за исключением того, что ей присваивается другое имя.
В целом, для объявления переменной служит следующий оператор: тип имя_переменной;
где тип – это конкретный тип объявляемой переменной, а имя_переменной – имя самой переменной. Помимо типа int, в C# поддерживается ряд других типов данных. В следующей строке программы переменной х присваивается значение 100. х = 100; // здесь переменной х присваивается значение 100
В C# оператор присваивания обозначается одиночным знаком равенства (=).
Данный оператор выполняет копирование значения, расположенного справа от знака равенства, в переменную, находящуюся слева от него.
В следующей строке программы осуществляется вывод на экран текстовой строки "х содержит " и значения переменной х. Console.WriteLine("х содержит " + х);
В этом операторе знак + обозначает, что значение переменной х выводится вслед за предшествующей ему текстовой строкой. Если обобщить этот частный случай, то с помощью знака операции + можно организовать сцепление какого угодно числа эле ментов в одном операторе с вызовом метода WriteLine().
В следующей строке программы переменной у присваивается значение перемен ной х, деленное на 2. у = х / 2;
В этой строке значение переменной х делится на 2, а полученный результат со храняется в переменной у. Таким образом, после выполнения данной строки в пере менной у содержится значение 50. При этом значение переменной х не меняется. Как и в большинстве других языков программирования, в C# поддерживаются все арифме тические операции, в том числе и перечисленные ниже.
Сложение
Вычитание
Умножение / Деление
Рассмотрим две оставшиеся строки программы. Console.Write("у содержит х / 2: "); Console.WriteLine(у);
В этих строках обнаруживаются еще две особенности. Во-первых, для вывода тек стовой строки "у содержит х / 2: " на экран используется встроенный метод Write().
После этой текстовой строки новая строка не следует. Это означает, что последующий вывод будет осуществлен в той же самой строке. Метод Write() по добен методу WriteLine(), за исключением того, что после каждого его вызова вы вод не начинается с новой строки. И во-вторых, обратите внимание на то, что в вы зове метода WriteLine() указывается только переменная у. Оба метода, Write() и WriteLine(), могут быть использованы для вывода значений любых встроенных в C# типов.
Прежде чем двигаться дальше, следует упомянуть еще об одной особенности объяв ления переменных. Две иди более переменных можно указать в одном операторе объявления. Нужно лишь разделить их запятой. Например, переменные х и у могут быть объявлены следующим образом. int х, у; // обе переменные объявляются в одном операторе
ПРИМЕЧАНИЕ В C# внедрено средство, называемое неявно типизированной переменной. Неявно типизированными являются такие переменные, тип которых автоматически определяется компилятором. Подробнее неявно типизированные переменные рассматриваются в главе 3. Другие типы данных
В предыдущем примере программы использовались переменные типа int. Но в переменных типа int могут храниться только целые числа. Их нельзя использовать в операциях с числами, имеющими дробную часть. Например, переменная типа int может содержать значение 18, но не значение 18,3. Правда, int – далеко не единствен ный тип данных, определяемых в С#. Для операций с числами, имеющими дробную часть, в C# предусмотрены два типа данных с плавающей точкой: float и double. Они обозначают числовые значения с одинарной и двойной точностью соответственно.
Из этих двух типов чаще всего используется тип double.
Для объявления переменной типа double служит оператор double result;
где result – это имя переменной типа double. А поскольку переменная result имеет тип данных с плавающей точкой, то в ней могут храниться такие числовые зна чения, как, например, 122,23, 0,034 или -19,0.
Для лучшего понимания отличий между типами данных int и double рассмо трим такой пример программы. /* Эта программа демонстрирует отличия между типами данных int и double. */ using System; class Example3 { static void Main() { int ivar; // объявить целочисленную переменную double dvar; // объявить переменную с плавающей точкой ivar = 100; // присвоить переменной ivar значение 100 dvar = 100.0; // присвоить переменной dvar значение 100.0 Console.WriteLine("Исходное значение ivar: " + ivar); Console.WriteLine("Исходное значение dvar: " + dvar); Console.WriteLine(); // вывести пустую строку // Разделить значения обеих переменных на 3. ivar = ivar / 3; dvar = dvar / 3.0; Console.WriteLine("Значение ivar после деления: " + ivar); Console.WriteLine("Значение dvar после деления: " + dvar); } }
Ниже приведен результат выполнения приведенной выше программы. Исходное значение ivar: 100 Исходное значение dvar: 100 Значение ivar после деления: 33 Значение dvar после деления: 33.3333333333333
Как видите, при делении значения переменной ivar типа int на 3 остается лишь целая часть результата – 33, а дробная его часть теряется. В то же время при делении значения переменной dvar типа double на 3 дробная часть результата сохраняется. Как демонстрирует данный пример программы, в числовых значениях с плаваю щей точкой следует использовать обозначение самой десятичной точки. Например, значение 100 в С# считается целым, а значение 100,0 – с плавающей точкой. В данной программе обнаруживается еще одна особенность. Для вывода пустой строки достаточно вызвать метод WriteLine() без аргументов.
Типы данных с плавающей точкой зачастую используются в операциях с реальными числовыми величинами, где обычно требуется дробная часть числа. Так, приведенная ниже программа вычисляет площадь круга, используя значение 3,1416 числа "пи". // Вычислить площадь круга. using System; class Circle { static void Main() { double radius; double area; radius = 10.0; area = radius * radius * 3.1416; Console.WriteLine("Площадь равна " + area); } }
Выполнение этой программы дает следующий результат. Площадь равна 314.16
Очевидно, что вычисление площади круга не дало бы удовлетворительного резуль тата, если бы при этом не использовались данные с плавающей точкой. Два управляющих оператора
Выполнение программы внутри метода (т.е. в его теле) происходит последователь но от одного оператора к другому, т.е. по цепочке сверху вниз. Этот порядок выпол нения программы можно изменить с помощью различных управляющих операторов, поддерживаемых в С#. Более подробно управляющие операторы будут рассмотрены в дальнейшем, а здесь они представлены вкратце, поскольку используются в последую щих примерах программ. Условный оператор
С помощью условного оператора if в C# можно организовать выборочное выпол нение части программы. Оператор if действует в C# практически так же, как и опера тор IF в любом другом языке программирования. В частности, с точки зрения синтак сиса он тождествен операторам if в С, C++ и Java. Ниже приведена простейшая форма этого оператора. if(условие) оператор;
Здесь условие представляет собой булево, т.е. логическое, выражение, принимаю щее одно из двух значений: "истина" или "ложь". Если условие истинно, то оператор выполняется. А если условие ложно, то выполнение программы происходит, минуя оператор. Ниже приведен пример применения условного оператора. if(10 < 11) Console.WriteLine("10 меньше 11");
В данном примере условное выражение принимает истинное значение, поскольку 10 меньше 11, и поэтому метод WriteLine() выполняется. А теперь рассмотрим дру гой пример. if(10 < 9) Console.WriteLine("не подлежит выводу");
В данном примере 10 не меньше 9. Следовательно, вызов метода WriteLine() не произойдет.
В C# определен полный набор операторов отношения, которые можно использовать в условных выражениях. Ниже перечислены все эти операторы и их обозначения.
Операция Значение < Меньше <= Меньше или равно
Больше = Больше или равно == Равно != Не равно
Далее следует пример еще одной программы, демонстрирующей применение условного оператора if. // Продемонстрировать применение условного оператора if. using System; class IfDemo { static void Main() { int a, b, c; a = 2; b = 3; if(a < b) Console.WriteLine("а меньше b"); // He подлежит выводу. if(a == b) Console.WriteLine("этого никто не увидит"); Console.WriteLine(); c = a – b; // с содержит -1 Console.WriteLine("с содержит -1"); if(с >= 0) Console.WriteLine("значение с неотрицательно"); if(с < 0) Console.WriteLine("значение с отрицательно"); Console.WriteLine(); с = b – а; // теперь с содержит 1 Console.WriteLine("с содержит 1"); if(с >= 0) Console.WriteLine("значение с неотрицательно"); if(с < 0) Console.WriteLine("значение с отрицательно "); } }
Вот к какому результату приводит выполнение данной программы. а меньше b с содержит -1 значение с отрицательно с содержит 1 значение с неотрицательно
Обратите внимание на еще одну особенность этой программы. В строке int а, b, с;
три переменные, а, b и с, объявляются списком, разделяемым запятыми. Как упоми налось выше, если требуется объявить две или более переменные одного и того же типа, это можно сделать в одном операторе, разделив их имена запятыми. Оператор цикла
Для повторного выполнения последовательности операций в программе можно организовать цикл. Язык C# отличается большим разнообразием циклических кон струкций. Здесь будет рассмотрен оператор цикла for. Как и у оператора if, у опе ратора for в C# имеются аналоги в С, C++ и Java. Ниже приведена простейшая форма этого оператора. for(инициализация; условие; итерация) оператор;
В самой общей форме в части инициализация данного оператора задается началь ное значение переменной управления циклом. Часть условие представляет собой булево выражение, проверяющее значение переменной управления циклом. Если ре зультат проверки истинен, то цикл продолжается. Если же он ложен, то цикл завер шается. В части итерация определяется порядок изменения переменной управления циклом на каждом шаге цикла, когда он повторяется. Ниже приведен пример краткой программы, демонстрирующей применение оператора цикла for. // Продемонстрировать применение оператора цикла for. using System; class ForDemo { static void Main() { int count; for(count = 0; count < 5; count = count+1) Console.WriteLine("Это подсчет: " + count); Console.WriteLine("Готово!"); } }
Вот как выглядит результат выполнения данной программы. Это подсчет: 0 Это подсчет: 1 Это подсчет: 2 Это подсчет: 3 Это подсчет: 4 Готово!
В данном примере count выполняет роль переменной управления циклом. В ини циализирующей части оператора цикла for задается нулевое значение этой перемен ной. В начале каждого шага цикла, включая и первый, проверяется условие count < 5. Если эта проверка дает истинный результат, то выполняется оператор, содержащий метод WriteLine(). Далее выполняется итерационная часть оператора цикла for, где значение переменной count увеличивается на 1. Этот процесс повторяется до тех пор, пока значение переменной count не достигнет величины 5. В этот момент про верка упомянутого выше условия дает ложный результат, что приводит к завершению цикла. Выполнение программы продолжается с оператора, следующего после цикла.
Любопытно, что в программах, профессионально написанных на С#, вы вряд ли уви дите итерационную часть оператора цикла в том виде, в каком она представлена в при веденном выше примере программы, т.е. вы редко встретите следующую строку. count = count + 1;
Дело в том, что в C# имеется специальный оператор инкремента, выполняющий приращение на 1 значение переменной, или так называемого операнда. Этот оператор обозначается двумя знаками +(++). Используя оператор инкремента, можно перепи сать приведенную выше строку следующим образом. count++;
Таким образом, оператор цикла for из приведенного выше примера программы обычно записывается в следующем виде. for(count = 0; count < 5; count++)
Опробуйте этот более краткий способ записи итерационной части цикла. Вы сами можете убедиться, что данный цикл выполняется так же, как и прежде.
В C# имеется также оператор декремента, обозначаемый двумя дефисами (–). Этот оператор уменьшает значение операнда на 1. Использование кодовых блоков
Еще одним важным элементом C# является кодовый блок, который представляет собой группу операторов. Для его организации достаточно расположить операторы между открывающей и закрывающей фигурными скобками. Как только кодовый блок будет создан, он станет логическим элементом, который можно использовать в любом месте программы, где применяется одиночный оператор. В частности, кодовый блок может служить адресатом операторов if и for. Рассмотрим следующий оператор if. if(w < h) { v = w * h; w = 0; }
Если в данном примере кода значение переменной w меньше значения перемен ной h, то оба оператора выполняются в кодовом блоке. Они образуют внутри кодового блока единый логический элемент, причем один не может выполняться без другого. Таким образом, если требуется логически связать два (или более) оператора, то для этой цели следует создать кодовый блок. С помощью кодовых блоков можно более эффективно и ясно реализовать многие алгоритмы.
Ниже приведен пример программы, в которой кодовый блок служит для того, что бы исключить деление на нуль. // Продемонстрировать применение кодового блока. using System; class BlockDemo { static void Main() { int i, j, d; i = 5 ; j = 10; // Адресатом этого оператора if служит кодовый блок. if(i != 0) { Console.WriteLine("i не равно нулю"); d = j / i; Console.WriteLine("j / i равно " + d); } } }
Вот к какому результату приводит выполнение данной программы. i не равно нулю j / i равно 2
В данном примере адресатом оператора if служит кодовый блок, а не единствен ный оператор. Если условие, управляющее оператором if, оказывается истинным, то выполняются три оператора в кодовом блоке. Попробуйте задать нулевое значение переменной i, чтобы посмотреть, что из этого получится.
Рассмотрим еще один пример, где кодовый блок служит для вычисления суммы и произведения чисел от 1 до 10. // Вычислить сумму и произведение чисел от 1 до 10. using System; class ProdSum { static void Main() { int prod; int sum; int i; sum = 0; prod = 1; for(i=1; i <= 10; i++) { sum = sum + i; prod = prod * i; } Console.WriteLine("Сумма равна " + sum); Console.WriteLine("Произведение равно " + prod); } }
Ниже приведен результат выполнения данной программы. Сумма равна 55 Произведение равно 3628800
В данном примере внутри кодового блока организуется цикл для вычисления сум мы и произведения. В отсутствие такого блока для достижения того же самого резуль тата пришлось бы организовать два отдельных цикла.
И последнее: кодовые блоки не снижают эффективность программ во время их вы полнения. Иными словами, наличие символов { и }, обозначающих кодовый блок, никоим образом не замедляет выполнение программы. В действительности приме нение кодовых блоков, как правило, приводит к повышению быстродействия и эф фективности программ, поскольку они упрощают программирование определенных алгоритмов. Точка с запятой и оформление исходного текста программы
В C# точка с запятой обозначает конец оператора. Это означает, что каждый опера тор в отдельности должен оканчиваться точкой с запятой.
Как вы уже знаете, кодовый блок представляет собой набор логически связанных операторов, заключенных в фигурные скобки. Блок не оканчивается точкой с запятой, поскольку он состоит из группы операторов. Вместо этого окончание кодового блока обозначается закрывающей фигурной скобкой.
В С# конец строки не означает конец оператора – о его окончании свидетельствует только точка с запятой. Именно поэтому оператор можно поместить в любой части строки. Например, на языке C# строки кода х = у; у = у + 1; Console.WriteLine(х + " " + у);
означают то же самое, что и строка кода х = у; у = у + 1; Consо1е.WriteLine(х + " " + у);
Более того, составные элементы оператора можно располагать в отдельных строках. Например, следующий фрагмент кода считается в C# вполне допустимым. Console.WriteLine("Это длинная строка вывода" + х + у + z + "дополнительный вывод");
Такое разбиение длинных строк нередко применяется для того, чтобы сделать ис ходный текст программы более удобным для чтения. Оно помогает также исключить заворачивание слишком длинных строк.
Возможно, вы уже обратили внимание на то, что в предыдущих примерах про грамм некоторые операторы были набраны с отступом. В C# допускается свободная форма записи. Это означает, что взаимное расположение операторов в строке не имеет особого значения. Но с годами в программировании сложился общепринятый стиль оформления исходного текста программ с отступами, что существенно облегчает чтение этого текста. Именно этому стилю следуют примеры программ в данной книге, что рекомендуется делать и вам. В соответствии с этим стилем следует делать отступ (в виде нескольких пробелов) после каждой открывающей фигурной скобки и возвра щаться назад после закрывающей фигурной скобки. А для некоторых операторов даже требуется дополнительный отступ, но об этом речь пойдет далее. Ключевые слова C
Основу любого языка программирования составляют его ключевые слова, посколь ку они определяют средства, встроенные в этот язык. В C# определены два общих типа ключевых слов: зарезервированные и контекстные. Зарезервированные ключевые слова нельзя использовать в именах переменных, классов или методов. Их можно использо вать только в качестве ключевых слов. Именно поэтому они и называются зарезервиро ванными. Их иногда еще называют зарезервированными словами, или зарезервированными идентификаторами. В настоящее время в версии 4.0 языка С# определено 77 зарезерви рованных ключевых слов (табл. 2.1).
Таблица 2.1. Ключевые слова, зарезервированные в языке C# abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while
Кроме того, в версии C# 4.0 определены 18 контекстных ключевых слов, которые приобретают особое значение в определенном контексте. В таком контексте они вы полняют роль ключевых слов, а вне его они могут использоваться в именах других элементов программы, например в именах переменных. Следовательно, контекстные ключевые слова формально не являются зарезервированными. Но, как правило, их сле дует считать зарезервированными, избегая их применения в любых других целях. Ведь применение контекстного ключевого слова в качестве имени какого-нибудь другого элемента программы может привести к путанице, и поэтому считается многими про граммистами плохой практикой. Контекстные ключевые слова приведены в табл. 2.2. Таблица 2.2. Контекстные ключевые слова в C# add dynamic from get global group into join let orderby partial remove select set value var where yield Идентификаторы
В C# идентификатор представляет собой имя, присваиваемое методу, переменной или любому другому определяемому пользователем элементу программы. Идентифи каторы могут состоять из одного или нескольких символов. Имена переменных могут начинаться с любой буквы алфавита или знака подчеркивания. Далее может следовать буква, цифра или знак подчеркивания. С помощью знака подчеркивания можно по высить удобочитаемость имени переменной, как, например, line_count. Но иден тификаторы, содержащие два знака подчеркивания подряд, например, max__value, зарезервированы для применения в компиляторе. Прописные и строчные буквы в C# различаются. Так, например myvar и MyVar – это разные имена переменных. Ниже приведены некоторые примеры допустимых идентификаторов. Test x У2 MaxLoad up _top my_var sample23 Помните, что идентификатор не может начинаться с цифры. Например, 12х – недей ствительный идентификатор. Хорошая практика программирования требует выбирать идентификаторы, отражающие назначение или применение именуемых элементов. Несмотря на то что зарезервированные ключевые слова нельзя использовать в ка честве идентификаторов, в C# разрешается применять ключевое слово с предшествую щим знаком @ в качестве допустимого идентификатора. Например, @for – действи тельный идентификатор. В этом случае в качестве идентификатора фактически служит ключевое слово for, а знак @ просто игнорируется. Ниже приведен пример програм мы, демонстрирующей применение идентификатора со знаком @. // Продемонстрировать применение идентификатора со знаком @. using System; class IdTest { static void Main() { int @if; // применение ключевого слова if // в качестве идентификатора for(@if = 0; @if < 10; @if++) Console.WriteLine("@if равно " + @if); } }
Приведенный ниже результат выполнения этой программы подтверждает, что @if правильно интерпретируется в качестве идентификатора. @if равно 0 @if равно 1 @if равно 2 @if равно 3 @if равно 4 @if равно 5 @if равно 6 @if равно 7 @if равно 8 @if равно 9
Откровенно говоря, применять ключевые слова со знаком @ в качестве идентифи каторов не рекомендуется, кроме особых случаев. Помимо того, знак @ может пред шествовать любому идентификатору, но такая практика программирования считается плохой. Библиотека классов среды .NET Framework
В примерах программ, представленных в этой главе, применялись два встроен ных метода: WriteLine() и Write(). Как упоминалось выше, эти методы являются членами класса Console, относящегося к пространству имен System, которое опре деляется в библиотеке классов для среды .NET Framework. Ранее в этой главе пояс нялось, что среда C# опирается на библиотеку классов, предназначенную для среды .NET Framework, чтобы поддерживать операции ввода-вывода, обработку строк, ра боту в сети и графические пользовательские интерфейсы. Поэтому, вообще говоря, C# представляет собой определенное сочетание самого языка C# и стандартных классов .NET. Как будет показано далее, библиотека классов обеспечивает функциональные возможности, являющиеся неотъемлемой частью любой программы на С#. Для того чтобы научиться программировать на С#, нужно знать не только сам язык, но и уметь пользоваться стандартными классами. Различные элементы библиотеки классов для среды .NET Framework рассматриваются в части I этой книги, а в части II – сама библиотека по отдельным ее составляющим.