CFA LogoCFA Logo Computer
Новости Статьи Магазин Прайс-лист Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2003 ГОД

Пошарпанный практикум

Игорь ПАВЛОВ pavlov_igor@nm.ru

Не так давно компания Microsoft анонсировала новый язык программирования C#. Если быть совсем точным, то Microsoft предложила новую концепцию создания программ, которую назвала Microsoft .NET, а язык C# является основным языком этой технологии. Что это за концепция такая? И почему языку C# прочат большое будущее? Думаю, что найти ответы на эти вопросы можно, лишь испробовав собственноручно новый язык в действии.

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

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

Для того чтобы приступить к разбирательству с языком C#, приведу немного общей информации, которая необходима для «быстрого» старта (более детальную информацию см. в [3]).

Для написания C#-программ нам как минимум понадобится любой текстовый редактор и установленная на компьютере .NET Framework. К сожалению, если у вас нет Windows Server 2003, то придется скачать .NET Framework с сайта Microsoft (http://go.microsoft.com/fwlink/?LinkId=5584). .NET Framework включает в себя общеязыковую исполняющую среду CLR (Common Language Runtime), в которой выполняется программа. Если на компьютере отсутствует общеязыковая исполняющая среда CLR, то .NET-программы выполняться не будут. Также .NET Framework содержит в себе библиотеку классов FCL (Framework Class Library), на базе которых строится любая .NET-программа. Любой используемый в программе тип данных входит в состав FCL. Это, так сказать, минимальный набор для написания C#-программ. Кроме того, можно писать C#-программы в визуальной среде разработке Visual Studio .NET, которая включает в себя .NET Framework.

В состав .NET Framework входит бесплатный C#-компилятор csc.exe, который мы будем по мере необходимости использовать. После инсталляции .NET Framework компилятор находиться в папке с названием С:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\ или что-то вроде того, в зависимости от номера версии .NET Framework.

Результатом компиляции C#-кода является сборка. Сборка — это один или несколько файлов, которые объединены логической связью. Поначалу с пониманием сборки возникают трудности. Но в большинстве случаев C#-программа — это сборка, состоящая из одного файла как обычный исполняемый файл. .NET-сборку можно получить и при компиляции любым другим .NET-компилятором, например VisualBasic.NET или C++ Managed Extentions.

Для затравки рассмотрим классический пример консольной программы, выводящий строку Hello, World! Синтаксис C# является C-подобным, поэтому легок в понимании и не должен вызывать затруднений. Все пояснения к примеру будут приводиться по ходу статьи.

Текст программы можно набрать в любом текстовом редакторе и сохранить с названием HelloWorld.cs. Расширение .cs — это расширение для C#-программ. Язык C# является регистро-зависимым, поэтому в нашем случае размер как раз имеет значение :-). Комментарии в тексте программы обрамляются так: /* Comment */ или так: // Comment, в зависимости от того, доходит ли комментарий до конца строки или нет.

Для компиляции программы введите в командной строке:

Если ошибок нет, то компилятор создаст файл HelloWorld.exe. Запускайте и наслаждайтесь! Программа Вам выдаст на экран строку Hello, World!

Как театр начинается с вешалки, так знакомство с языком начинается с изучения типов данных. Все данные в C# могут быть элементарного, ссылочного или размерного типа. С другой стороны, все типы FCL прямо или косвенно наследуются от базового типа System.Object. Благодаря чему каждый тип обладает базовой функциональностью.

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

Здесь System.Int32 — тип FCL. Однако в C# используется упрощенный синтаксис:

Типы данных, которые поддерживаются компилятором напрямую, называются элементарными типами. В Таблице 1 приведен список элементарных типов C#.

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

При выходе переменной размерного типа из области видимости отведенная под нее память высвобождается автоматически. Если тип данных называется структурой (structure) или перечислением (enumeration), то это размерный тип.

Следующий пример — пример описания и использования объекта ссылочного типа (класса):

Память для ссылочных типов всегда выделяется из управляемой кучи. При выходе переменной ссылочного типа из области видимости, освобождением памяти, отведенной для нее, занимается сборщик мусора (Garbage Collector, о нем поговорим чуть позже). Если тип данных называется классом (class), то это ссылочный тип.

Все члены класса описываются внутри фигурных скобок. Членами класса могут быть поля, методы, свойства, индексаторы, атрибуты и интерфейсы.

Пример описания полей:

Пример описания методов:

Каждый класс, поле и метод имеет модификатор доступа, который определяет степень его «видимости». Список модификаторов доступа приведен в Таблице 2.

Таблица 1   Таблица 2

Например:

или

Если модификатор доступа не указан, член класса считается private. Кроме того, он может быть объявлен как статический (static). Это означает, что для обращения к члену класса не надо создавать экземпляр этого класса. Именно так мы и поступили в примере «Hello, World!» при описании метода Main:

Каждое C#-приложение должно иметь метод с именем Main, описанный в одном из его классов. Не имеет значения, в каком классе описан этот метод — важно, чтобы только один класс программы имел метод Main, иначе компилятор выдаст ошибку, не будучи в состоянии определить точку входа в программу. В примере «Hello, World!» есть класс App, а все, что есть в приложении, описано в контексте этого класса. В том числе и точка входа в программу — метод Main. Причем, метод Main должен быть описан как открытый (public) и статический (static).

Язык C# является объектно-ориентированным языком, в котором полностью отсутствуют глобальные переменные, функции и процедуры, присущие другим языкам программирования. Вместо этого существуют поля, свойства и методы классов. Как и полагается ООП-языку, в C# реализованы все три концепции ООП: инкапсуляция, наследование и полиморфизм. Инкапсуляция — возможность скрыть внутренне устройство объекта; достигается путем назначения каждому члену класса своего модификатора доступа, а также благодаря использованию свойств. Наследование — возможность использования функциональности класса-предка; достигается путем создания нового класса, в основу которого положен существующий класс. И, наконец, полиморфизм — возможность класса наследника изменять код класса предка; возможен благодаря виртуальным методам и их переопределению.

Теперь вернемся к нашему примеру «Hello, World!» и обратим внимание на самую первую строчку:

В этой строчке указывается, что в программе используется тип из пространства имен System. Все типы в FCL образуют иерархическую структуру пространств имен (namespace). Каждый тип в FCL описан в каком-то пространстве имен. В нашем примере строка Console.WriteLine("Hello, World!") вызывает статический метод класса Console. Класс Console находится в пространстве имен System, поэтому надо было писать так:

Но для сокращения название пространства имен можно вынести в using. Например, вы хотите объявить переменную типа System.Int32. Следующие три варианта объявления равносильны:

System.Int32 x; /* Неудобный способ объявления */

using System;

Int32 x;

int x; /* Самый удобный способ объявления */

Все FCL-типы, которые используются в программе, описаны в системных библиотеках — сборках. Если программа использует какой-либо тип из другой сборки, то она должна ссылаться на нее. Ссылки на внешние сборки указываются при компиляции программы специальным ключом компилятора (/reference). К счастью, компилятор csc.exe при работе автоматически добавляет к программе ссылки на основные системные сборки, избавляя нас от лишней работы.

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

С классическим примером «Hello, World!» вроде как разобрались. Теперь усложним задачу. Напишем программу, вычисляющую сумму двух чисел.

Сохраните набранный текст в файле с названием DoSumm.cs. Откомпилируйте его, введя в командной строке:

Основным классом данного примера является DoSumm. Здесь появился новый для нас статический метод Console.ReadLine(), который считывает введенную текстовую строку. Далее, для того чтобы привести введенную текстовую строку string к целочисленному типу int x, вызывается статический метод Int32.Parse(). Аналогичным образом считываем значение переменной y. Заметьте, что для вызова статических методов мы не создаем экземпляров классов Console или Int32. Для вывода суммы двух чисел используем форматированный вывод Сумма равна {0}, где вместо {0} подставится рассчитанная сумма.

Теперь рассмотрим решение задачи нахождения суммы с применением классов. У любого класса, будь то FCL-класс или класс, описанный вами, есть конструктор. Думаю, что с конструкторами вы уже встречались в других языках программирования. Конструктор — это специальный метод класса, вызываемый всякий раз при создании экземпляра класса. Конструктор гарантирует, что объект будет инициализирован должным образом, прежде чем будет использован в программе. Для того чтобы компилятор знал, что данный метод является конструктором класса, имя конструктору дается такое же, как и имя класса. Класс может иметь несколько конструкторов с разным набором аргументов. Любой класс наследуется от объекта System.Object, а значит, конструктор наследует его по умолчанию. Ниже приведен пример класса с двумя конструкторами:

Первый, SummClass() — конструктор по умолчанию, который перекрывает такой же класса System.Object. Второй конструктор, SomeClass(int a1, int a2), принимает два параметра, которыми затем инициализируются поля x и y класса SummClass. Чуть ниже описан класс App, в котором описана точка входа программы — метод Main. Можно было метод Main описать в классе SummClass, однако он специально вынесен в другой класс для наглядности.

В методе Main используется две переменных c1 и c2 типа SummClass. Причем, экземпляры типов этих переменных создаются разными конструкторами. Данный пример показывает инициализацию переменных в разных конструкторах. Обращение к методу DoSumm выполняет сумму полей экземпляра класса.

Заметьте, что в этом примере создаются экземпляры ссылочного типа, но нет деструкторов этих экземпляров. У созданных объектов не надо вызывать деструкторы, как раньше. За вас это сделает сборщик мусора (Garbage Collector). Как только объект становится ненужным, сборщик мусора высвобождает всю память, занятую им. Это еще одно новшество, появившееся в .NET. Бывалые программисты поначалу будут чувствовать себя неуютно и каждый раз пытаться вызывать деструкторы объектов собственноручно.

И напоследок рассмотрим пример работы со строками. Для работы со строками в C# предусмотрен элементарный тип string, который представляет собой массив символов char. В языке C# все строки хранятся в Unicode-кодировке. Ниже приведен пример работы со сроками:

В этом примере появились оператор сравнения (==) и оператор выбора (if). Программа просит ввести имя. Если введенное имя совпадает со строкой "Bill", то выполняется одна ветка программы, если не совпадает, то выполняется другая ветка. Кроме этого выполняется конкатенация (сложение) строк:

Следующий пример демонстрирует работу с массивами.

Объявление и инициализация массива целых чисел, состоящего из пяти элементов, происходит в строке

Заметьте, что кроме пространства имен System используется еще одно пространство имен —System.Collections, т.к. в нем описаны классы массивов. Далее в программе подсчитывается сумма всех элементов массива. Для этого элементы массива перебираются двумя способами. Первый способ, знакомый программистам на C, использует временную переменную i для индексации элементов массива:

Второй способ, более элегантный, появившийся в языке C#, использует оператор foreach. Этот оператор позволяет обратиться к каждому элементу массива, занося поочередно каждый элемент массива в переменную val.

Сумма элементов массива подсчитывается в переменных Sum1 и Sum2 с помощью оператора +=, который также знаком многим программистам. Последняя строка, Console.WriteLine("Sum1={0}, Sum2={1}", Sum1, Sum2), производит форматный вывод результатов суммирования на консоль.

Рассмотрев вышеприведенные примеры, вы наверняка согласитесь, что синтаксис языка C# очень прост в понимании. Для тех, кто интересуется этим языком C#, созданы многочисленные тематические конференции и рассылки. Если вы заинтересовались им, предлагаю присоединиться к одной из них. Для этого надо отослать пустое письмо по адресу dotnet_ru-subscribe@yahoogroups.com.

(Продолжение следует)

Литература:

1. Том Арчер. Основы C#: пер. с англ.-М.: Microsoft Press, 2001.-448с.

2. Рихтер Джеффри. Программирование на платформе .NET Framework: пер. с агнл.-М.: Microsoft Press, 2002.-488с.

3. Игорь Павлов. Что .NET грядущий нам готовит? «Мой Компьютер» №10 (233)

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © www.sector.biz.ua 2006-2015 design by Vadim Popov