Классификация типов данных си шарп

Типы и члены C#

C# является объектно-ориентированным языком, а значит поддерживает инкапсуляцию, наследование и полиморфизм. Класс наследуется непосредственно из одного родительского класса. Он может реализовывать любое число интерфейсов. Методы, которые переопределяют виртуальные методы родительского класса, должны содержать ключевое слово override , чтобы исключить случайное переопределение. В языке C# структура похожа на облегченный класс: это тип, распределяемый в стеке и реализующий интерфейсы, но не поддерживающий наследование. C# предоставляет record class типы и record struct , которые представляют собой типы, цель которых заключается в основном в хранении значений данных.

Все типы инициализируются с помощью конструктора, метода, ответственного за инициализацию экземпляра. Два объявления конструктора имеют уникальное поведение:

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

Классы и объекты

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

Новые классы создаются с помощью объявлений классов. Объявление класса начинается с заголовка. Заголовок указывает:

  • Атрибуты и модификаторы класса
  • Имя класса
  • Базовый класс (при наследовании от базового класса)
  • Интерфейсы, реализуемые классом.

За заголовком между разделителями < и >следует тело класса, в котором последовательно объявляются все члены класса.

Читайте также:  Php mysqli connect charset

Следующий код является простым примером объявления класса с именем Point :

public class Point < public int X < get; >public int Y < get; >public Point(int x, int y) => (X, Y) = (x, y); > 

Экземпляры классов создаются с помощью оператора new , который выделяет память для нового экземпляра, вызывает конструктор для инициализации этого экземпляра и возвращает ссылку на экземпляр. Следующие инструкции создают два объекта Point и сохраняют ссылки на эти объекты в двух переменных:

var p1 = new Point(0, 0); var p2 = new Point(10, 20); 

Занимаемая объектом память автоматически освобождается, когда объект становится недоступен. В C# нет ни необходимости, ни возможности освобождать память объектов явным образом.

var p1 = new Point(0, 0); var p2 = new Point(10, 20); 

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

public class PointFactory(int numberOfPoints) < public IEnumerableCreatePoints() < var generator = new Random(); for (int i = 0; i < numberOfPoints; i++) < yield return new Point(generator.Next(), generator.Next()); >> > 

Класс можно использовать, как показано в следующем коде:

var factory = new PointFactory(10); foreach (var point in factory.CreatePoints()) < Console.WriteLine($"(, )"); > 

Параметры типа

Универсальные классы определяют параметры типа. Параметры типа — это список имен параметров типа, заключенных в угловые скобки. Параметры типа следуют за именем класса. Параметры типа можно использовать в теле класса в определениях, описывающих члены класса. В следующем примере для класса Pair заданы параметры типа TFirst и TSecond :

public class Pair  < public TFirst First < get; >public TSecond Second < get; >public Pair(TFirst first, TSecond second) => (First, Second) = (first, second); > 

Тип класса, для которого объявлены параметры типа, называется универсальным типом класса. Типы структуры, интерфейса и делегата также могут быть универсальными. Если вы используете универсальный класс, необходимо указать аргумент типа для каждого параметра типа, вот так:

var pair = new Pair(1, "two"); int i = pair.First; //TFirst int string s = pair.Second; //TSecond string 

Универсальный тип, для которого указаны аргументы типа, как Pair в примере выше, называется сконструированным типом.

базовых классов;

В объявлении класса может быть указан базовый класс. Имя базового класса указывается после имени класса и параметров типа и отделяется от них двоеточием. Если спецификация базового класса не указана, класс наследуется от типа object . В следующем примере Point3D имеет базовый класс Point . В первом примере Point имеет базовый класс object :

public class Point3D : Point < public int Z < get; set; >public Point3D(int x, int y, int z) : base(x, y) < Z = z; >> 

Класс наследует члены базового класса. Наследование означает, что класс неявно содержит почти все элементы базового класса. Класс не наследует экземпляры, статические конструкторы и метод завершения. Производный класс может добавлять новые члены к наследуемым, но не может удалить определение для наследуемого члена. В предыдущем примере Point3D наследует члены X и Y из Point , и каждый экземпляр Point3D содержит три свойства: X , Y и Z .

Используется неявное преобразование из типа класса к любому из типов соответствующего базового класса. Переменная типа класса может ссылаться как на экземпляр этого класса, так и на экземпляры любого производного класса. Например, если мы используем описанные выше объявления классов, то переменная типа Point может ссылаться на Point или Point3D :

Point a = new(10, 20); Point b = new Point3D(10, 20, 30); 

Структуры

Классы определяют типы, поддерживающие наследование и полиморфизм. Они позволяют создавать сложные расширения функциональности на основе иерархий производных классов. Типы структур , напротив, являются более простыми типами, основной целью которых является хранение значений данных. В структурах не может быть объявлен базовый тип; они неявно наследуются от System.ValueType. От типа struct не могут быть унаследованы другие типы struct . Они неявно запечатаны.

public struct Point < public double X < get; >public double Y < get; >public Point(double x, double y) => (X, Y) = (x, y); > 

интерфейсов,

Интерфейсы могут использовать множественное наследование. В следующем примере интерфейс IComboBox наследует одновременно от ITextBox и IListBox .

interface IControl < void Paint(); >interface ITextBox : IControl < void SetText(string text); >interface IListBox : IControl < void SetItems(string[] items); >interface IComboBox : ITextBox, IListBox

Классы и структуры могут реализовывать несколько интерфейсов. В следующем примере класс EditBox реализует одновременно IControl и IDataBound .

interface IDataBound < void Bind(Binder b); >public class EditBox : IControl, IDataBound < public void Paint() < >public void Bind(Binder b) < >> 

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

EditBox editBox = new(); IControl control = editBox; IDataBound dataBound = editBox; 

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

Тип Enum определяет набор значений констант. В следующем объявлении enum определяются константы, соответствующие различным корнеплодам:

public enum SomeRootVegetable

Также можно определить enum , которое будет использоваться в виде сочетания флагов. В следующем объявлении определяется набор флагов для четырех времен года. Можно применить любое сочетание времен года, в том числе значение All , включающее все времена года:

[Flags] public enum Seasons

В следующем примере показаны объявления для обоих указанных выше перечислений:

var turnip = SomeRootVegetable.Turnip; var spring = Seasons.Spring; var startingOnEquinox = Seasons.Spring | Seasons.Autumn; var theYear = Seasons.All; 

Типы, допускающие значение NULL

int? optionalInt = default; optionalInt = 5; string? optionalText = default; optionalText = "Hello World."; 

Кортежи

C# поддерживает кортежи, которые предоставляют краткий синтаксис для группировки нескольких элементов данных в упрощенной структуре данных. Чтобы создать экземпляр кортежа, необходимо объявить типы и имена элементов между ( и ) , как показано в следующем примере:

(double Sum, int Count) t2 = (4.5, 3); Console.WriteLine($"Sum of elements is ."); //Output: //Sum of 3 elements is 4.5. 

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

Источник

Классификация типов данных си шарп

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

В языке C# есть следующие базовые типы данных:

    bool : хранит значение true или false (логические литералы). Представлен системным типом System.Boolean

bool alive = true; bool isDead = false;
byte bit1 = 1; byte bit2 = 102;
sbyte bit1 = -101; sbyte bit2 = 102;
short n1 = 1; short n2 = 102;
ushort n1 = 1; ushort n2 = 102;
int a = 10; int b = 0b101; // бинарная форма b =5 int c = 0xFF; // шестнадцатеричная форма c = 255
uint a = 10; uint b = 0b101; uint c = 0xFF;
long a = -10; long b = 0b101; long c = 0xFF;
ulong a = 10; ulong b = 0b101; ulong c = 0xFF;
char a = 'A'; char b = '\x5A'; char c = '\u0420';
string hello = "Hello"; string word = "world";
object a = 22; object b = 3.14; object c = "hello code";

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

string name = "Tom"; int age = 33; bool isEmployed = false; double weight = 78.65; Console.WriteLine($"Имя: "); Console.WriteLine($"Возраст: "); Console.WriteLine($"Вес: "); Console.WriteLine($"Работает: ");

Для вывода данных на консоль здесь применяется интерполяция: перед строкой ставится знак $ и после этого мы можем вводить в строку в фигурных скобках значения переменных. Консольный вывод программы:

Имя: Tom Возраст: 33 Вес: 78,65 Работает: False

Использование суффиксов

При присвоении значений надо иметь в виду следующую тонкость: все вещественные литералы (дробные числа) рассматриваются как значения типа double . И чтобы указать, что дробное число представляет тип float или тип decimal , необходимо к литералу добавлять суффикс: F/f — для float и M/m — для decimal.

float a = 3.14F; float b = 30.6f; decimal c = 1005.8M; decimal d = 334.8m;

Подобным образом все целочисленные литералы рассматриваются как значения типа int . Чтобы явным образом указать, что целочисленный литерал представляет значение типа uint, надо использовать суффикс U/u , для типа long — суффикс L/l , а для типа ulong — суффикс UL/ul :

uint a = 10U; long b = 20L; ulong c = 30UL;

Использование системных типов

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

int a = 4; System.Int32 b = 4;

Неявная типизация

Ранее мы явным образом указывали тип переменных, например, int x; . И компилятор при запуске уже знал, что x хранит целочисленное значение.

Однако мы можем использовать и модель неявной типизации:

var hello = "Hell to World"; var c = 20;

Для неявной типизации вместо названия типа данных используется ключевое слово var . Затем уже при компиляции компилятор сам выводит тип данных исходя из присвоенного значения. Так как по умолчанию все целочисленные значения рассматриваются как значения типа int , то поэтому в итоге переменная c будет иметь тип int . Аналогично переменной hello присваивается строка, поэтому эта переменная будет иметь тип string

Эти переменные подобны обычным, однако они имеют некоторые ограничения.

Во-первых, мы не можем сначала объявить неявно типизируемую переменную, а затем инициализировать:

// этот код работает int a; a = 20; // этот код не работает var c; c= 20;

Во-вторых, мы не можем указать в качестве значения неявно типизируемой переменной null :

// этот код не работает var c=null;

Так как значение null, то компилятор не сможет вывести тип данных.

Источник

Оцените статью