Pull to refresh

Учимся C#. Ведро третье

Reading time6 min
Views49K

Результаты отзывов


Про аудиторию


Так ка много комментариев было по этому поводу, то решил сделать последнюю попытку. Надеюсь на фидбек в комментариях — получилось «Для Всех» или нет.

Про книги


После прочтения комментариев решил опубликовать список книг, которые там рекомендовались:
C# 2008. Ускоренный курс
CLR via C#
C# и платформа .NET
C# 2.0. Полное руководство

Про разное


Были вопросы по поводу скорости Mono. на днях нашёл ссылку, на который есть небольшой тест. geekswithblogs.net
Тестирование проводилось на более ранних версиях, но я думаю ситуация не глобально изменилась. ИМХО

Ну а теперь давайте продолжим обучение…

Сложные типы


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

Типы по значению


Структуры


В C# структура — это особый тип класса. Поскольку структура размещается в стеке, она может создаваться и копироваться более эффективно, чем класс. Рассмотрим небольшую структуру:
  1. public struct Subscriber
  2. {
  3.  public long SubID;
  4.  public string FirstName;
  5.  public string LastName;
  6.  public string MiddleName;
  7.  public decimal Balance;
  8. }

Если нам понадобится скопировать из одной структуры в другую, то просто поставим знак равенства. Давайте создадим один объект Subscriber, Sub1, и установим значеи полей. После этого скопируем значение всех полей из одной структуру в другую, Sub2:
  1. Subscriber Sub1;
  2. Subscriber Sub2;
  3. //Инициализируем структуру и заполним поля
  4. Sub1 = new Subscriber();
  5. Sub1.FirstName = "Вася";
  6. Sub1.LastName = "Пупкин";
  7. Sub1.MiddleName = "Какой-то";
  8. Sub1.Balance = 100;
  9.  
  10. //И теперь одной строкой копируем содержимое одной структуры в другую
  11. Sub2 = Sub1;

Заметили, что мы использовали new, хотя струтктура является типом по значению? Просто доступ к структуре возможен до вызова операнда new.
Помимо копирования, структура делает более аккуратным вызов функций.

Если вы гуру C или C++, то будьте осторожны — они изменились! В C/C++ единственное различие между классом и структурой заключалось в том, что они были общедоступными, а не закрытыми.
Струтура в C# совершенно новая игрушка, не только по тому, что их члены по умолчания являются закрытыми, но экземпляры структур и экземпляры классов размещаются в различных местах памяти.
Структуры могут поддерживать большинство функций класса (хотя и не поддерживает наследование реализаций), но их необходимо использовать осторожно. Лучше всегшо структуры годятся для предоставления небольших объектов.

Перечисления


Перечисления (enumerations) — целочисленные типы, которые определяет пользователь. При обьявлении перечислений вы специфицируете набор допустимых значений, которые могут принимать экземпляры перечислений. Кроме того нужно присвоить значениям интуитивно понятные имена.
В дальнейшей работе перечисления могут сыграть очень важную роль и облегчить жизнь программисту. Обьявляются перечисления вот так:
  1. public enum DaysOfWeek
  2. {
  3.  Monday = 0,
  4.  Tuesday = 1,
  5.  Wednesday = 2,
  6.  Thursday = 3,
  7.  Friday = 4,
  8.  Saturday = 5,
  9.  Sunday = 6
  10. }

Здесь мы используем целые значения, которые соответствуют дням недели. Доступ к конкретному дню недели можно получить вот так: DaysOfWeek.Wednesday вернет 2. Обычно перечисления используют в тех случаях, когда нужно передавать соответствующее значение методу, который будет проходить по всем значениям спомощью switch и выдавать соответствующий результат. Про switch более подробно мы поговорим чуть позднее, а пока давайте посмотрим пример:
  1. class Program
  2.   {
  3.     static void Main(string[] args)
  4.     {
  5.       WriteText(DaysOfWeek.Sunday);
  6.       Console.ReadLine();
  7.     }
  8.  
  9.     static void WriteText(DaysOfWeek days)
  10.     {
  11.       switch (days)
  12.       {
  13.         case DaysOfWeek.Monday:
  14.           Console.WriteLine("Понедельник - день тяжелый!");
  15.           break;
  16.         case DaysOfWeek.Tuesday:
  17.           Console.WriteLine("Вторник - это значит что понедельник уже прошел!");
  18.           break;
  19.         case DaysOfWeek.Wednesday:
  20.           Console.WriteLine("Среда! Средина недели!");
  21.           break;
  22.         //И так далее...
  23.       }
  24.     }
  25.   }


Типы по ссылке


Классы


Классы являются основным определяемым пользовательским типом в C# и платформе .NET. Практически все программы имеют по крайней мере один класс (теоретически можно использовать структуру вместо класса), который содержит метод Main() — точку входа в программу.
Классы — это составные типы данных, которые включают в себя члены данных и функции. классы так же содержат в себе вложеные типы данных. Более подробно про классы поговорим через одно «ведро». =)

Интерфейсы


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

Делегаты


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

Массивы


Массив задает способ организации данных. Массивом называют упорядоченную совокупность элементов одного типа. Каждый элемент массива имеет индексы, определяющие порядок элементов. Число индексов характеризует размерность массива.
В языке C#, как и во многих других языках, индексы задаются целочисленным типом.
В языке C# снято существенное ограничение языка C++ на статичность массивов. Массивы в языке C# являются настоящими динамическими массивами.

Объявление массивов

Рассмотрим, как объявляются одномерные массивы.

Объявление одномерных массивов

Общая структура объявления:
[<атрибуты>] [<модификаторы>] <тип> <имя>;

Забудем пока об атрибутах и модификаторах. Объявление одномерного массива выглядит следующим образом:
<тип>[] <имя>;

Заметьте, в отличие от языка C++ квадратные скобки приписаны не к имени переменной, а к типу. Они являются неотъемлемой частью определения класса, так что запись T[] следует понимать как класс одномерный массив с элементами типа T.
  1. //объявление массива
  2. int[] Integers;

Это пример объявления массива. Так же можно инициализировать массив используя new:
  1. //Создаём массив из 32 значений типа int
  2. int[] Integers = new int[32];

Для получения доступа к элементу массива применяется обычный синтаксис:
  1. Integers[0] = 24;

C# позволяет нам создавать массивы не инициализируя их, поэтому они могут менять размер в ходе выполнения программы.
  1. int[] Integers;
  2. Integers = new int[32];

Массивы в C# сохранили возможность, как и в C/C++, инициализации значений, перечисленых в фигурных скобках.
  1. string[] Privet = {"раз", "два", "три"};
  2. //Что эквивалентно
  3. string[] Privet = new string[] {"раз", "два", "три"};

Однако есть и подводные камни! Например для установки размера массива нельзя использовать переменную:
  1. int len = 3;
  2. //Не скомпилируется
  3. string[] Privet = new string[len] {"раз", "два", "три"};
  4.  
  5. /* Однако мы можем использовать константу */
  6.  
  7. const int len = 3; //Это константа
  8. //А теперь скомпилируется
  9. string[] Privet = new string[len] {"раз", "два", "три"};


Что интересного можно делать с массивом?
Узнаем длину массива:
  1. int Dlina = Massiv.Length;
  2. //ToString() - переводит из int в string
  3. Console.WriteLine(Dlina.ToString());

Отсортируем:
  1. //Наш массив передаётся в качестве параметра методу Sort()
  2. Array.Sort(Massiv);

Изменяем порядок:
  1. //Наш массив передаётся в качестве параметра методу Reverse()
  2. Array.Reverse(Massiv);

и ещё многое другое…

Про многомерные массивы рекомендую прочитать в книге самостоятельно.

Итак на сегодня думаю достаточно. Не поверите, но пропустил один день из-за того, что после печатания мною этой (аналогичной) статьи в ХабраРедакторе что-то заглючил браузер и я не успел сохранить. Очень сильно разозлился и пошёл спать. Эмоции…
Tags:
Hubs:
+19
Comments51

Articles

Change theme settings