Результаты отзывов
Про аудиторию
Так ка много комментариев было по этому поводу, то решил сделать последнюю попытку. Надеюсь на фидбек в комментариях — получилось «Для Всех» или нет.
Про книги
После прочтения комментариев решил опубликовать список книг, которые там рекомендовались:
C# 2008. Ускоренный курс
CLR via C#
C# и платформа .NET
C# 2.0. Полное руководство
Про разное
Были вопросы по поводу скорости Mono. на днях нашёл ссылку, на который есть небольшой тест. geekswithblogs.net
Тестирование проводилось на более ранних версиях, но я думаю ситуация не глобально изменилась. ИМХО
Ну а теперь давайте продолжим обучение…
Сложные типы
C# позволяет определять свои собственные сложные типы на основе имеющихся простых типов. Как и примитивы, сложные типы могут разделяться на типы по ссылке и по значению.
Типы по значению
Структуры
В C# структура — это особый тип класса. Поскольку структура размещается в стеке, она может создаваться и копироваться более эффективно, чем класс. Рассмотрим небольшую структуру:
- public struct Subscriber
- {
- public long SubID;
- public string FirstName;
- public string LastName;
- public string MiddleName;
- public decimal Balance;
- }
Если нам понадобится скопировать из одной структуры в другую, то просто поставим знак равенства. Давайте создадим один объект Subscriber, Sub1, и установим значеи полей. После этого скопируем значение всех полей из одной структуру в другую, Sub2:
- Subscriber Sub1;
- Subscriber Sub2;
- //Инициализируем структуру и заполним поля
- Sub1 = new Subscriber();
- Sub1.FirstName = "Вася";
- Sub1.LastName = "Пупкин";
- Sub1.MiddleName = "Какой-то";
- Sub1.Balance = 100;
-
- //И теперь одной строкой копируем содержимое одной структуры в другую
- Sub2 = Sub1;
Заметили, что мы использовали new, хотя струтктура является типом по значению? Просто доступ к структуре возможен до вызова операнда new.
Помимо копирования, структура делает более аккуратным вызов функций.
Если вы гуру C или C++, то будьте осторожны — они изменились! В C/C++ единственное различие между классом и структурой заключалось в том, что они были общедоступными, а не закрытыми.
Струтура в C# совершенно новая игрушка, не только по тому, что их члены по умолчания являются закрытыми, но экземпляры структур и экземпляры классов размещаются в различных местах памяти.
Структуры могут поддерживать большинство функций класса (хотя и не поддерживает наследование реализаций), но их необходимо использовать осторожно. Лучше всегшо структуры годятся для предоставления небольших объектов.
Перечисления
Перечисления (enumerations) — целочисленные типы, которые определяет пользователь. При обьявлении перечислений вы специфицируете набор допустимых значений, которые могут принимать экземпляры перечислений. Кроме того нужно присвоить значениям интуитивно понятные имена.
В дальнейшей работе перечисления могут сыграть очень важную роль и облегчить жизнь программисту. Обьявляются перечисления вот так:
- public enum DaysOfWeek
- {
- Monday = 0,
- Tuesday = 1,
- Wednesday = 2,
- Thursday = 3,
- Friday = 4,
- Saturday = 5,
- Sunday = 6
- }
Здесь мы используем целые значения, которые соответствуют дням недели. Доступ к конкретному дню недели можно получить вот так: DaysOfWeek.Wednesday вернет 2. Обычно перечисления используют в тех случаях, когда нужно передавать соответствующее значение методу, который будет проходить по всем значениям спомощью switch и выдавать соответствующий результат. Про switch более подробно мы поговорим чуть позднее, а пока давайте посмотрим пример:
- class Program
- {
- static void Main(string[] args)
- {
- WriteText(DaysOfWeek.Sunday);
- Console.ReadLine();
- }
-
- static void WriteText(DaysOfWeek days)
- {
- switch (days)
- {
- case DaysOfWeek.Monday:
- Console.WriteLine("Понедельник - день тяжелый!");
- break;
- case DaysOfWeek.Tuesday:
- Console.WriteLine("Вторник - это значит что понедельник уже прошел!");
- break;
- case DaysOfWeek.Wednesday:
- Console.WriteLine("Среда! Средина недели!");
- break;
- //И так далее...
- }
- }
- }
Типы по ссылке
Классы
Классы являются основным определяемым пользовательским типом в C# и платформе .NET. Практически все программы имеют по крайней мере один класс (теоретически можно использовать структуру вместо класса), который содержит метод Main() — точку входа в программу.
Классы — это составные типы данных, которые включают в себя члены данных и функции. классы так же содержат в себе вложеные типы данных. Более подробно про классы поговорим через одно «ведро». =)
Интерфейсы
Интерфейс в C# содержит только абстрактные элементы, не имеющие реализации. Непосредственно реализация этих элементов должна содержаться в классе, производном от данного интерфейса.
Интерфейсы C# могут содержать методы, свойства и индексаторы, но в отличие, например, от Java, они не могут содержать константных значений.
Например, если интерфейс содержит в себе метод, то он будет работать, но сам код реализации метода внутри него не будет.
Делегаты
Делегаты — это типы, которые ссылаются на методы. Они похожи на указатели функций в C++, но разрешают создавать экземпляр класса и вызывать как статичные методы, так и методы конкретного экземпляра класса.
Для новичков пока ещё рано вникать в тонкости, поэтому просто запомните название — мы ещё вернёмся к ним.
Массивы
Массив задает способ организации данных. Массивом называют упорядоченную совокупность элементов одного типа. Каждый элемент массива имеет индексы, определяющие порядок элементов. Число индексов характеризует размерность массива.
В языке C#, как и во многих других языках, индексы задаются целочисленным типом.
В языке C# снято существенное ограничение языка C++ на статичность массивов. Массивы в языке C# являются настоящими динамическими массивами.
Объявление массивов
Рассмотрим, как объявляются одномерные массивы.
Объявление одномерных массивов
Общая структура объявления:
[<атрибуты>] [<модификаторы>] <тип> <имя>;
Забудем пока об атрибутах и модификаторах. Объявление одномерного массива выглядит следующим образом:
<тип>[] <имя>;
Заметьте, в отличие от языка C++ квадратные скобки приписаны не к имени переменной, а к типу. Они являются неотъемлемой частью определения класса, так что запись T[] следует понимать как класс одномерный массив с элементами типа T.
- //объявление массива
- int[] Integers;
Это пример объявления массива. Так же можно инициализировать массив используя new:
- //Создаём массив из 32 значений типа int
- int[] Integers = new int[32];
Для получения доступа к элементу массива применяется обычный синтаксис:
- Integers[0] = 24;
C# позволяет нам создавать массивы не инициализируя их, поэтому они могут менять размер в ходе выполнения программы.
- int[] Integers;
- Integers = new int[32];
Массивы в C# сохранили возможность, как и в C/C++, инициализации значений, перечисленых в фигурных скобках.
- string[] Privet = {"раз", "два", "три"};
- //Что эквивалентно
- string[] Privet = new string[] {"раз", "два", "три"};
Однако есть и подводные камни! Например для установки размера массива нельзя использовать переменную:
- int len = 3;
- //Не скомпилируется
- string[] Privet = new string[len] {"раз", "два", "три"};
-
- /* Однако мы можем использовать константу */
-
- const int len = 3; //Это константа
- //А теперь скомпилируется
- string[] Privet = new string[len] {"раз", "два", "три"};
Что интересного можно делать с массивом?
Узнаем длину массива:
- int Dlina = Massiv.Length;
- //ToString() - переводит из int в string
- Console.WriteLine(Dlina.ToString());
Отсортируем:
- //Наш массив передаётся в качестве параметра методу Sort()
- Array.Sort(Massiv);
Изменяем порядок:
- //Наш массив передаётся в качестве параметра методу Reverse()
- Array.Reverse(Massiv);
и ещё многое другое…
Про многомерные массивы рекомендую прочитать в книге самостоятельно.
Итак на сегодня думаю достаточно. Не поверите, но пропустил один день из-за того, что после печатания мною этой (аналогичной) статьи в ХабраРедакторе что-то заглючил браузер и я не успел сохранить. Очень сильно разозлился и пошёл спать. Эмоции…