355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Герберт Шилдт » C# 4.0: полное руководство » Текст книги (страница 3)
C# 4.0: полное руководство
  • Текст добавлен: 6 апреля 2017, 04:00

Текст книги "C# 4.0: полное руководство"


Автор книги: Герберт Шилдт



сообщить о нарушении

Текущая страница: 3 (всего у книги 83 страниц)

Данная строка начинается с ключевого слова static. Метод, определяемый ключевым словом static, может вызываться до создания объекта его класса. Необходимость в этом объясняется тем, что метод Main() вызывается при запуске программы. Ключевое слово void указывает на то, что метод Main() не возвращает значение. В дальнейшем вы узнаете, что методы могут также возвращать значения. Пустые круглые скобки после имени метода Main означают, что этому методу не передается никакой информации. Теоретически методу Main() можно передать информацию, но в данном примере этого не делается. И последним элементом анализируемой строки является символ {, обозначающий начало тела метода Main(). Весь код, составляющий тело метода, находится между открывающими и закрывающими фигурными скобками.

Рассмотрим следующую строку программы. Обратите внимание на то, что она находится внутри метода Main().

Console.WriteLine(«Простая программа на С#.»);

В этой строке осуществляется вывод на экран текстовой строки "Простая программа на C#. Сам вывод выполняется встроенным методом WriteLine(). В данном примере метод WriteLine() выводит на экран строку, которая ему передается. Информация, передаваемая методу, называется аргументом. Помимо текстовых строк, метод WriteLine() позволяет выводить на экран другие виды информации. Анализируемая строка начинается с Console – имени предопределенного класса, поддерживающего ввод-вывод на консоль. Сочетание обозначений Console и WriteLine() указывает компилятору на то, что метод WriteLine() является членом класса Console. Применение в C# объекта для определения вывода на консоль служит еще одним свидетельством объектно-ориентированного характера этого языка программирования.

Обратите внимание на то, что оператор, содержащий вызов метода WriteLine(), оканчивается точкой с запятой, как, впрочем, и рассматривавшаяся ранее директива using System. Как правило, операторы в C# оканчиваются точкой с запятой. Исключением из этого правила служат блоки, которые начинаются символом { и оканчиваются символом }. Именно поэтому строки программы с этими символами не оканчиваются точкой с запятой. Блоки обеспечивают механизм группирования операторов и рассматриваются далее в этой главе.

Первый символ } в анализируемой программе завершает метод Main(), а второй – определение класса Example.

И наконец, в C# различаются прописные и строчные буквы. Несоблюдение этого правила может привести к серьезным осложнениям. Так, если вы неумышленно наберете main вместо Main или же writeline вместо WriteLine, анализируемая программа окажется ошибочной. Более того, компилятор C# не предоставит возможность выполнить классы, которые не содержат метод Main(), хотя и скомпилирует их. Поэтому если вы неверно наберете имя метода Main, то получите от компилятора сообщение об ошибке, уведомляющее о том, что в исполняемом файле Example.ехе не определена точка входа.


Обработка синтаксических ошибок

Если вы только начинаете изучать программирование, то вам следует научиться правильно истолковывать (и реагировать на) ошибки, которые могут появиться при попытке скомпилировать программу. Большинство ошибок компиляции возникает в результате опечаток при наборе исходного текста программы. Все программисты рано или поздно обнаруживают, что при наборе исходного текста программы очень легко сделать опечатку. Правда, если вы наберете что-нибудь неправильно, компилятор выдаст соответствующее сообщение о синтаксической ошибке при попытке скомпилировать вашу программу. В таком сообщении обычно указывается номер строки исходного текста программы, где была обнаружена ошибка, а также кратко описывается характер ошибки.

Несмотря на всю полезность сообщений о синтаксических ошибках, выдаваемых компилятором, они иногда вводят в заблуждение. Ведь компилятор C# пытается извлечь какой-то смысл из исходного текста, как бы он ни был набран. Именно по этой причине ошибка, о которой сообщает компилятор, не всегда отражает настоящую причину возникшего затруднения. Неумышленный пропуск открывающей фигурной скобки после метода Main() в рассмотренном выше примере программы приводит к появлению приведенной ниже последовательности сообщений об ошибках при компиляции данной программы компилятором командной строки сsc. (Аналогичные ошибки появляются при компиляции в интегрированной среде разработки Visual Studio.)

EX1.CS (12,21): ошибка CS1002: ; ожидалось

EX1.CS(13,22): ошибка CS1519: Недопустимая лексема '(' в

объявлении члена класса, структуры или интерфейса

EX1.CS(15,1): ошибка CS1022: Требуется определение типа

или пространства имен либо признак конца файла

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

Из всего изложенного выше следует, что если программа содержит синтаксическую ошибку, то сообщения компилятора не следует понимать буквально, поскольку они могут ввести в заблуждение. Для выявления истинной причины ошибки может потребоваться критический пересмотр сообщения об ошибке. Кроме того, полезно проанализировать несколько строк кода, предшествующих той строке, в которой обнаружена сообщаемая ошибка. Иногда об ошибке сообщается лишь через несколько строк после того места, где она действительно произошла.


Незначительное изменение программы

Несмотря на то что приведенная ниже строка указывается во всех примерах программ, рассматриваемых в этой книге, формально она не нужна.

using System;

Тем не менее она указывается ради удобства. Эта строка не нужна потому, что в C# можно всегда полностью определить имя с помощью пространства имен, к которому оно принадлежит. Например, строку

Console.WriteLine(«Простая программа на С#.»);

можно переписать следующим образом.

System.Console.WriteLine(«Простая программа на С#.»);

Таким образом, первый пример программы можно видоизменить так.

// В эту версию не включена строка «using System;».

class Example {

// Любая программа на C# начинается с вызова метода Main().

  static void Main() {

    // Здесь имя Console.WriteLine полностью определено.

    System.Console.WriteLine(«Простая программа на С#.»);

  }

}

Указывать пространство имен System всякий раз, когда используется член этого пространства, – довольно утомительное занятие, и поэтому большинство программистов на C# вводят директиву using System в начале своих программ, как это сделано в примерах всех программ, приведенных в данной книге. Следует, однако, иметь в виду, что любое имя можно всегда определить, явно указав его пространство имен, если в этом есть необходимость.


Вторая простая программа

В языке программирования, вероятно, нет более важной конструкции, чем переменная. Переменная — это именованная область памяти, для которой может быть установлено значение. Она называется переменной потому, что ее значение может быть изменено по ходу выполнения программы. Иными словами, содержимое переменной подлежит изменению и не является постоянным.

В приведенной ниже программе создаются две переменные – х и у.

// Эта программа демонстрирует применение переменных.

using System;

class Example2 {

  static void Main() {

    int x; // здесь объявляется переменная

    int y; // здесь объявляется еще одна переменная

    x = 100; // здесь переменной х присваивается значение 100

    Console.WriteLine("х содержит " + x);

    y = x / 2;

    Console.Write("у содержит x / 2: ");

    Console.WriteLine(y);

  }

}

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

х содержит 100

у содержит х / 2: 50

В этой программе вводится ряд новых понятий. Прежде всего, в операторе

int х; // здесь объявляется переменная

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

В следующей строке объявляется вторая переменная с именем у.

int у; // здесь объявляется еще одна переменная

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

В целом, для объявления переменной служит следующий оператор:

тип имя_переменной;

где тип — это конкретный тип объявляемой переменной, а имя_переменной — имя самой переменной. Помимо типа int, в C# поддерживается ряд других типов данных. В следующей строке программы переменной х присваивается значение 100.

х = 100; // здесь переменной х присваивается значение 100    ,

В C# оператор присваивания обозначается одиночным знаком равенства (=). Данный оператор выполняет копирование значения, расположенного справа от знака равенства, в переменную, находящуюся слева от него.

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

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 в C# считается целым, а значение 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 в любом другом языке программирования. В частности, с точки зрения синтаксиса он тождествен операторам i f в С, 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(c >= 0) Console.WriteLine(«значение с неотрицательно»);

    if(c < 0) Console.WriteLine(«значение с отрицательно»);

    Console.WriteLine();

    c = b – a; // теперь с содержит 1

    Console.WriteLine(«с содержит 1»);

    if(c >= 0) Console.WriteLine(«значение с неотрицательно»);

    if(c < 0) Console.WriteLine ("значение с отрицательно ");

  }

}

Вот к какому результату приводит выполнение данной программы.

а меньше b

с содержит -1 значение с отрицательно

с содержит 1

значение с неотрицательно

Обратите внимание на еще одну особенность этой программы. В строке

int а, 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

В данном примере внутри кодового блока организуется цикл для вычисления суммы и произведения. В отсутствие такого блока для достижения того же самого результата пришлось бы организовать два отдельных цикла.

И последнее: кодовые блоки не снижают эффективность программ во время их выполнения. Иными словами, наличие символов { и }, обозначающих кодовый блок, никоим образом не замедляет выполнение программы. В действительности применение кодовых блоков, как правило, приводит к повышению быстродействия и эффективности программ, поскольку они упрощают программирование определенных алгоритмов.


    Ваша оценка произведения:

Популярные книги за неделю