C sharp с нуля

Обучение языка Си Шарп

■ Введение в язык Си Шарп
■ Переменные в C#
■ Одномерные массивы C#
■ Инициализация массива C#
■ Двумерные массивы C#
■ MessageBox в C#
■ Случайные числа C#
■ Строки в C#
■ Структура в C#
■ Временная задержка C#
■ Работа с файлом в Си Шарп. File C#
■ Шифрование в Си Шарп | C#
■ Методы в Си Шарп | C#
■ Математические функции в Си Шарп
■ Возведение в степень на Си Шарп
■ Экспонента в Си Шарп
■ Квадратный корень в Си Шарп
■ Вычисление логарифма в Си Шарп
■ Преобразование типов в языке Си Шарп
■ Рисование линии в Си Шарп
■ Сортировка на языке Си Шарп
■ Операторы выбора Си Шарп
■ Рисование в форме C#
■ Градиентная заливка C#
■ Рисование прямоугольника C#
■ Заливка прямоугольника C#
■ Очистка формы C# от графики
■ Убрать все пробелы в начале и в конце текста на Си Шарп
■ Си Шарп: Найти заменить в тексте
■ Убрать все пробелы на Си Шарп
■ Преобразование типа string в char C#
■ Преобразование типа char в string C#
■ Найти факториал Си Шарп
■ Сумма факториалов Си Шарп
■ Работа с графикой на платформе .NET
■ Прототип простейшего графического редактора
■ Создание приложения C#
■ Класс табулирования функции одной переменной
■ Обзор Microsoft Visual Studio 2005
■ Отладка программы
■ Пошаговый режим
■ Точки останова
■ Безусловные точки останова
■ Условные точки останова
■ Просмотр переменных
■ Стек вызова функций
■ Разработка оконных приложений
■ Размещение компонентов на форме. Свойства компонента.
■ Компонент CheckBox
■ Компонент CheckBoxListBox
■ Компонент TextBox
■ Компонент RichTextBox
■ Компонент ListBox
■ Компонент ComboBox
■ Компонент Label
■ Компонент LinkLabel
■ Компонент ProgressBar
■ Указатели и управление памятью
■ ТИПЫ ДАННЫХ
■ Переменные
■ Приведение типов
■ Перегрузка операций
■ Циклы While
■ Цикл foreach
■ Поля и свойства
■ Использование переменного числа аргументов
■ Конструкторы и деструкторы
■ Ключевое слово this
■ Ключевое слово static
■ Наследование
■ Интерфейсы
■ Реализация интерфейсов
■ Интерфейсные свойства
■ Интерфейсные индексаторы
■ Массивы
■ Одномерные массивы
■ Двумерные массивы
■ Массивы массивов
■ Обработка исключительных ситуаций
■ Предварительная проверка параметров
■ Проверка кодов возврата функций и методов
■ Блоки try-catch
■ Применение блока finally
■ Массивы как коллекции
■ Коллекция ArrayList
■ КЛАССЫ И ОБЪЕКТЫ. ИНКАПСУЛЯЦИЯ. Теоретические основы
■ КОНСТРУКТОРЫ, ПОЛИМОРФИЗМ И НАСЛЕДОВАНИЕ. Теоретические основы
■ ЗНАКОМСТВО СО СРЕДОЙ MS VISUAL STUDIO — Обзор Microsoft Visual Studio 2005
■ Создание простого приложения в MS Visual Studio
■ Отладка программы C#
■ Пошаговый режим C#
■ Точки останова C#
■ Безусловные точки останова C#
■ Условные точки останова C#
■ Просмотр переменных C#
■ Стек вызова функций C#
■ Разработка оконных приложений C#
■ Размещение компонентов на форме. Свойства компонента.
■ Основные компоненты C#
■ Компонент Button C#
■ Компонент CheckBox C#
■ Компонент CheckBoxListBox C#
■ Компонент RadioButton C#
■ Компонент TextBox C#
■ Компонент RichTextBox C#
■ Компонент ListBox C#
■ Компонент ComboBox C#
■ Компонент Label C#
■ Компонент LinkLabel C#
■ Компонент ProgressBar C#
■ Пример размещения компонентов в приложении C#
■ ЯЗЫК ПРОГРАММИРОВАНИЯ С# Обзор языка С#
■ ТИПЫ ДАННЫХ C#
■ Переменные C#
■ Приведение типов C#
■ Операции, приоритет C#
■ Перегрузка операций C#
■ Операторы выбора C#
■ Оператор if C#
■ Оператор switch C#
■ Операторы перехода C#
■ Оператор goto C#
■ Операторы break и continue C#
■ Оператор return C#
■ Оператор for C#
■ Циклы While C#
■ Цикл foreach C#
■ ПРОГРАММИРОВАНИЕ КЛАССОВ C#
■ Введение в классы и объекты в С#
■ Общий синтаксис класса C#
■ Поля и свойства C#
■ Методы C#
■ Использование переменного числа аргументов C#
■ Объявление объектов класса. Оператор new C#
■ Инциализация членов класса C#
■ Конструкторы и деструкторы C#
■ Ключевое слово this C#
■ Ключевое слово static C#
■ Наследование C#
■ Абстрактные классы C#
■ Интерфейсы C#
■ Реализация интерфейсов C#
■ Интерфейсные свойства C#
■ Интерфейсные индексаторы C#
■ Массивы C#
■ Типы массивов C#
■ Одномерные массивы C#
■ Двумерные массивы C#
■ Многомерные массивы C#
■ Массивы массивов C#
■ Обработка исключительных ситуаций C#
■ Предварительная проверка параметров C#
■ Проверка кодов возврата функций и методов C#
■ Применение механизма исключений C#
■ Блоки try-catch C#
■ Применение блока finally C#
■ Массивы как коллекции C#
■ Коллекция ArrayList C#
■ Первая программа на языке С#
■ Использование Microsoft Visual Studio 2005
■ Система типов языка С#
■ Объявление переменных
■ Выражения и операции
■ Арифметические операции
■ Операторы отношения
■ Логические операторы
■ Приоритеты операторов
■ Операторы языка C#
■ Управляющая кнопка. Компонент Button C#
■ Работа с классами C#
■ Переключатели C#
■ Наследование классов C#.
■ Конструкторы при наследовании C#
■ Приведение типов C#
■ Операторы is и as C#
■ Переопределение методов базового класса C#
■ При вызове виртуального метода, метод определяется типом объекта.
■ Окно Solution Explorer C#
■ Абстрактные классы
■ Интерфейсы C#
■ Свойства C#

>Интенсив «C# для начинающих»

Кому подойдут онлайн курсы «Основы языка C Sharp»?

Новичкам

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

Школьникам

Мы раскрываем сложные понятия на примерах, понятных детям. Для школьников Си-шарп – это возможность быстро приобщиться к языкам семейства «Си» и начать создавать программы в .NET Framework. Это короткий путь в серьезное программирование.

Всем желающим

Если хотите создать игру, но не знаете, с чего начать – запишитесь на урок и посмотрите, как C# упрощает программирование игр для начинающих.

1.1 Начальные понятия

Данный самоучитель рассчитан на людей, совершенно не знакомых с программированием, но способных скачать, установить и запустить программу — в данном случае Visual Studio 2010 (2008,2012). В первой части я кратко расскажу о основах языка C#. Формат самоучителя подразумевает краткое и упрощенное изложение — за подробностями касательно отдельных функций и классов обращайтесь в гугл и msdn, за продвинутыми методиками программирования в продвинутые книги. В принципе почти всю информацию можно найти в интернете, надо лишь знать что искать, так что в отличие от классических книг на несколько сотен страниц я буду давать ту основу, зная которую вы уже сможете сформулировать поисковый запрос — ни в одном разделе я сознательно не даю полной и исчерпывающей информации, ее место в документации. Крайне желательно знать английский язык хотя бы на уровне чтения со словарем — в англоязычном интернете информации на порядок больше, невероятно полезные сайты вроде StackOverflow не имеют русских аналогов, а русскоязычные форумы и обсуждения чаще всего напоминают знаменитый анекдот (под американским форумом можно смело понимать англоязычный с немцами, индусами и бразильцами):

Чем отличаются русский, американский и еврейский форумы?
— на американском форуме вы задаете вопрос и вам дают ответ
— на еврейском форуме вы задаете вопрос и вам задают встречный вопрос
— на русском форуме вы задаете вопрос и вам долго объясняют почему вы такой мудак.

Современные языки программирования вообще и C# в частности скрывают многие низкоуровневые особенности работы компьютеров, так что детально разбираться в особенностях работы регистров процессора и тому подобной зауми новичку не надо (99% программистов тоже). Но некоторые вещи стоит держать в уме.

Что такое язык программирования? Это язык, который понимает компьютер. (ваш Капитан Очевидность) Но на самом деле компьютер понимает только нули и единицы. Так что любой современный язык программирования на самом деле промежуточен — после того как вы напишете программу, он переводится на настоящий язык компьютера — компилируется. Таким образом сначала мы пишем программу на языке программирования в обычном текстовом файле, потом компиллируем в двоичный язык компьютера.

С# в этом плане еще сложней — сначала ваша программа на C# переводится в специальный промежуточный язык — байт-код, после чего уже этот промежуточный язык переводится в двоичный код. Промежуточный язык рассчитан на специальный набор промежуточных программ, которые надо установить на компьютер перед запуском программы на C# — .Net Framework.

Схема работы .Net и C#

Таким образом мы:

1. Пишем код на языке C# в обычный текстовый файл

2. Компилируем программу в байт-код с помощью компилятора C# (1 и 2 можно делать без Visual Studio, например набрать исходный текст в Блокноте и скомпилировать через командную строку)

3. Запускаем полученную программу на компьютере, где уже установлен .Net Framework соответствующей версии), который переводит программу в двоичный код и собственно запускает, давая доступ к компьютеру. (соответственно на компьютере без Net Framework программа не запустится вообще).

1.2 Привет мир

Перейдем к практике, для создания самой простой программы мы запустим Visual Studio и выполним следующее:

1. Пойдем в меню File-New Project (Файл — Новый проект) или сразу кликнем на Create New Project

2. Выберем шаблон Console Application (Консольное приложение)

3. Выберем каталог на диске, где будет расположен наш проект

4. Добавим две строчки в текст программы, чтобы он выглядел вот так

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestConsoleApplication { class Program { static void Main(string args) { System.Console.WriteLine(«Привет мир!»); System.Console.ReadLine(); } } }

4. Нажмем F5 (можно выбрать в меню Debug — Start Debugging ) и увидим черное окошко с нашим Привет мир, которое закроется после нажатия Enter.

Что это и зачем оно надо? В теории это программа без кнопок и меню, которой можно управлять через командную строку. В наше время такие программы используются редко, в основном очень продвинутыми сисадминами или в мире Linux (что в принципе одно и то же), но знать об их существовании полезно — программисту может довестись с такой работать или даже писать. Нам она нужна по одной-единственной причине — такая программа меньше всего будет отвлекать от изучения универсальных особенностей языка C#.

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

System.Console.WriteLine(«Привет мир!»); — выводит в консоль (то самое черное окно) строку «Привет мир»»

System.Console.ReadLine(); — читает строку, которую мы вводим (ввод завершается нажатием Enter) и переходит к следующей команде.

Так как следующей команды нет, программа завершает работу и закрывает окно.

1.3 Простые переменные

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

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

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

Некоторые из простых типов данных в C#

— int, целое число от -2,147,483,648 до 2,147,483,647
— string, строка
— double, число с дробной частью и переменным количеством знаков после запятой, например 1.38 принимает значения от -1,79769313486232 в 308 степени до 1,79769313486232 в 308 степени. Проще говоря очень большие.
— decimal, число с дробной частью и повышенной точностью рассчетов, специально для финансовых операций — в миллионных и более мелких долях float могут накапливаться мелкие ошибки, банки это не любят
— bool — специальный тип для передачи данных об истинности или ложности, принимает только два значения — true или false. В старых языках вместо него использовали int с значениями 1 и 0, но это было менее наглядно и приводило к ошибкам.

И многие другие типы.

Как уже говорилось выше очень часто программы обрабатывают данные о людях. Попробуем это сделать и мы.

static void Main(string args) { string stringToShow1, stringToShow2; string surname = «Шульженко»; string name = «Олег»; string otchestvo = «Васильевич»; int age = 40; double weight = 88.73; stringToShow1 = surname + » » + name + » » + otchestvo + «, возраст » + age + «, вес » + weight; surname = «Чугунов»; name = «Александр»; otchestvo = «Игоревич»; age = 23; weight = 66; stringToShow2 = surname + » » + name + » » + otchestvo + «, возраст » + age + «, вес » + weight; System.Console.WriteLine(stringToShow1); System.Console.WriteLine(stringToShow2); System.Console.ReadLine(); }

Не забудьте запустить по F5 и посмотреть результаты.

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

Стоит обратить внимание на склеивание нескольких строк в одну с помощью +. Больше информации можно найти , подробное описание всевозможных издевательств над строками —

1.4 Арифметические операции

Компьютеры почти всегда что-то считают. Собственно само слово computer означает вычислитель. В этой области даже самый слабенький процессор намного превосходит человеческий мозг.

static void Main(string args) { int a = 5; int b = 2; System.Console.WriteLine(«a = » + a + «, b = » + b); int result = a + b; System.Console.WriteLine(«Сложение, a + b = » + result); result = a * b; System.Console.WriteLine(«Умножение, a * b = » + result); result = a / b; System.Console.WriteLine(«Деление, a / b = » + result + » a и b — целые числа, деление только нацело»); double resultDouble = a / b; System.Console.WriteLine(«Деление, a / b = » + resultDouble + » все равно что-то не так…»); double aDouble = 5; resultDouble = aDouble / b; System.Console.WriteLine(«Деление, a / b = » + resultDouble); System.Console.ReadLine(); }

Почему произошло столь странное недоразумение с дробным числом во второй раз? Все дело в том, что внутри одной строки мы выполнили сразу несколько операций. А в каком порядке они выполняются? В порядке приоритета. И у оператора присваивания =, который записывает данные в переменную, этот приоритет один из самых низких

Сначала выполнилось деление двух целочисленных переменных a и b и только после этого целый результат деления записался в дробную переменную doubleResult.

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

Небольшое отступление:
В дальнейших примерах кода подразумевается, что вы самостоятельно вставите их внутрь

static void Main(string args) { }

1.5 Управление и логика

На данный момент наша программа не отличается умом — Скайнет из нее не получится, уничтожение человечеству не грозит. Мы просто выполняем команды по очереди, одну за другой, а хотелось бы принимать решения в зависимости от внешних условий — например «если есть возможность, уничтожить всех людей, иначе работать над созданием такой возможности». Делается это с с помощью специальной конструкции если-иначе, или, на родном для C# английском if-else и специальных операторов сравнения:

  • — величина слева меньше
  • — величина слева больше
  • и — меньше либо равно и больше либо равно
  • — просто равно, обратите внимание, что равенство очень похоже на оператор присваивания, который записывает значение в переменную = — не путайте их, равенство — это двойное «равно»
  • != — не равно
  • и другие

Компьютерная логика проста — высказывание или результат сравнения может быть либо истиной либо ложью, либо true либо flase, либо уничтожать человечество либо нет. Третьего компьютеру не дано. Для хранения таких данных существует специальный тип данных — логический — bool — который может принимать только два значения (догадываетесь какие?). Если вы хотите чего-то посложней и похардкорней — то все вместе это булева алгебра, изучайте и просвещайтесь.

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

— логическое И — оператор && — вовращает истину только в том случае, если и справа и слева от него будет истина, во всех остальных случаях будет ложь

— логическое ИЛИ — оператор || — возвращает истину если хоть одна из двух величин истинна. Ложь он вернет только если обе логические величины ложны

Ну например — если есть армия И есть энергия — напасть на человечество. При использовании оператора && нападения не произойдет если нет энергии или нет армии. А вот при использовании || глупая железяка попытается напасть даже если у нее нету армии, или эта армия лежит мертвой грудой без топлива и электричества.

bool boolVar1 = true; bool boolVar2 = true; if (boolVar1 && boolVar2) { System.Console.WriteLine(«Вернуло true логическое И для true и true»); } if (boolVar1 || boolVar2) { System.Console.WriteLine(«Вернуло true логическое ИЛИ для true и true»); } boolVar1 = true; boolVar2 = false; if (boolVar1 && boolVar2) { System.Console.WriteLine(«Вернуло true логическое И для true и false»); } if (boolVar1 || boolVar2) { System.Console.WriteLine(«Вернуло true логическое ИЛИ для true и false»); } System.Console.WriteLine(); System.Console.ReadLine();

1.6 Комментарии

До этого момента наши тестовые программки были просты до идиотизма. Теперь они начнут усложняться. Настоящие программы бывают сложными. Очень сложным. На самом деле самая трудная часть работы программиста — это не написать новую программу, а понять уже написанную, найти в ней ошибки, исправить их или что-то поменять, не сделав новых (!). Понимание программы очень облегчают комментарии — заметки прямо в коде, которые игнорирует компьютер. Они только для высшего разума — людей. Кроме того их часто используют для того, чтобы временно отключить часть программы не удаляя уже написанного кода — так и говорят, закомментировать.

bool boolVar1 = true; /* многострочный коментарий сейчас используется редко из-за встроенных функций Visual Studio */ bool boolVar2 = true; //однострочный комментарий

На практике многострочные комментарии в Visual Studio чаще всего ставятся с использованием специальной функции — у нее есть и кнопка и собственная горячая клавиша

Получаем вот такой код, который можно раскомментировать с помощью соседней кнопки

//if (boolVar1 && boolVar2) //{ // System.Console.WriteLine(«Вернуло true логическое И для true и true»); //} //if (boolVar1 || boolVar2) //{ // System.Console.WriteLine(«Вернуло true логическое ИЛИ для true и true»); //}

1.7 Циклы

Наша программа уже может что-то решать… но как-то убого она это делает, каждый чих надо прописывать вручную. А ведь настоящие роботы славятся своей способностью повторять любые действия неограниченное количество раз не зная усталости и сомнений! Делают они это с помощью циклов — специальных конструкций для программирования повторяющихся действий.

Самый простой цикл просто заставляет компьютер повторять какое-то действие, пока не выполнится какое-то логическое (см. выше!) условие. В C# такой цикл называется while

//считаем до семи int counter = 1; while (counter <= 7) { System.Console.WriteLine(«Значение счетчика: » + counter); counter++; } System.Console.ReadLine();

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

Можете проверить это утверждение закомментировав строку counter++; — программа будет работать бесконечно, так как counter никогда не будет равен 7. Придется прекратить ее работу вручную, закрыв окно.

Делать что-то заданное количество раз приходится так часто, что для этого случая придумали специальный цикл, ведь лень — это двигатель прогресса. Я имею в виду цикл for.

С его помощью даже самый простой цикл из предыдущего примера станет еще проще

//считаем до семи for (int counter = 1; counter <= 7; counter++) { System.Console.WriteLine(«Значение счетчика: » + counter); } System.Console.ReadLine();

В знаменитой статье Почему программисты не умеют программировать автор приводит следующие данные — большинство выпускников программистских вузов не могут написать очень простую программу — которая выведет на на экран числа от 1 до 100, вместо кратных 3 выведет Fizz, вместо кратных 5 выведет Buzz, вместо кратных и трем и пяти FizzBuzz (это в Америке такая обучающая игра для детей). На самом деле единственная сложность в такой задаче — вспомнить школьное определение кратности. Число кратно 3 если остаток от целочисленного (без учета дробной части) деления этого числа на 3 равен нулю. Осталось выяснить, как вычислить остаток от целочисленного деления. Это делает оператор %.

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

for (int counter = 1; counter <= 100; counter++) { int reminder3 = counter % 3; int reminder5 = counter % 5; if (reminder3 == 0 && reminder5 == 0) { System.Console.WriteLine(«FizzBuzz»); } else if (reminder3 == 0) { System.Console.WriteLine(«Fizz»); } else if (reminder5 == 0) { System.Console.WriteLine(«Buzz»); } else { System.Console.WriteLine(counter); } } System.Console.ReadLine();

Опытный программист может заметить, что одно из условий if лишнее и код можно сделать более коротким с использованием простого трюка — если число делится и на 3 и на 5, то можно просто выводить сначала Fizz потом Buzz, автоматически склеивая их в одну строку и не проверяя отдельно на предмет кратности и 3 и 5. Так как все в этом мире имеет свою цену, то более короткий код также будет менее понятным. В данном примере различие невелико, но в промышленном программировании со сложными и большими программами в большинстве случаев важна именно понятность кода.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *