Partial 3 страница.
В конструкторе экземпляра структуры ключевое слово this соответствует параметру out типа структуры, а в функции-члене экземпляра структуры ключевое слово this соответствует параметру ref типа структуры. В обоих случаях this считается переменной, что позволяет изменить всю структуру, для которой была вызвана эта функция-член, путем присваивания в this или передачи this в качестве параметра ref или out. 11.3.7 Инициализаторы полей; Как рассматривалось в §11.3.4, значение структуры по умолчанию состоит из значения, полученного путем установки для всех полей с типом значения соответствующих значений по умолчанию, а для всех полей ссылочного типа — значения null. По этой причине в структуре объявления полей экземпляра не могут содержаться инициализаторы переменных. Это ограничение действует только в отношении полей экземпляра. Статические поля структуры могут содержать инициализаторы переменных. Например: struct Point является неправильным, так как объявления полей экземпляра содержат инициализаторы переменных. 11.3.8 Конструкторы; В отличие от класса, в структуре нельзя объявить конструктор экземпляра без параметров. Вместо этого каждая структура неявно содержит конструктор экземпляра без параметров, который всегда возвращает значение, полученное путем установки для всех полей с типом значения соответствующих значений по умолчанию, а для всех полей с ссылочным типом — значения null (§4.1.2). В структуре можно объявлять конструкторы экземпляров с параметрами. Например: struct Point public Point(int x, int y) { В приведенном выше объявлении операторы Point p1 = new Point(); Point p2 = new Point(0, 0); создают объекты Point, свойства которых x и y инициализированы нулевыми значениями. Конструктор экземпляра структуры не может содержать инициализатор конструктора в форме base(...). Если в конструкторе экземпляра структуры не указан инициализатор конструктора, переменная this соответствует параметру out типа структуры, при этом, аналогично параметру out, объект this должен быть определенно присвоен (§5.3) в каждой точке возвращения из конструктора. Если в конструкторе экземпляра структуры указан инициализатор конструктора, переменная this соответствует параметру ref с типом структуры и, аналогично параметру ref, переменная this считается определенно присвоенной в точке входа в тело конструктора. Рассмотрим приведенную ниже реализацию конструктора: struct Point public int X { public int Y { public Point(int x, int y) { Ни одна из функций-членов экземпляра (включая методы доступа «set» для свойств X и Y) не может быть вызвана до тех пор, пока все поля создаваемой структуры не будут определенно присвоены. Однако, если бы объект Point был классом, а не структурой, реализация конструктора экземпляра была бы разрешена. 11.3.9 Деструкторы; В структуре не разрешается объявлять деструктор. 11.3.10 Статические конструкторы Для статических конструкторов структур в основном действуют те же правила, что и для статических конструкторов классов. Выполнение статического конструктора структуры запускается первым из следующих событий в домене приложения: · Ссылка на статический член с типом структуры. · Вызов явным образом объявленного конструктора с типом структуры. Создание значений по умолчанию (§11.3.4) с типом структуры не ведет к вызову статического конструктора. В качестве примера можно указать начальные значения элементов массива. 11.4 Примеры структур; Ниже приводится два примера использования типов struct для создания типов, которые могут использоваться аналогично встроенным типам языка, но имеют измененную семантику. 11.4.1 Тип целочисленного значения в базе данных Представленная ниже структура DBInt реализует тип integer, который может представлять полный набор значений с типом int, а также дополнительное состояние, указывающее на неизвестное значение. Тип с такими характеристиками повсеместно используется в базах данных. using System; public struct DBInt public static readonly DBInt Null = new DBInt(); // When the defined field is true, this DBInt represents a known value int value; // Private instance constructor. Creates a DBInt with a known value. DBInt(int value) { // The IsNull property is true if this DBInt represents an unknown value. public bool IsNull { get { return!defined; } } // The Value property is the known value of this DBInt, or 0 if this public int Value { get { return value; } } // Implicit conversion from int to DBInt. public static implicit operator DBInt(int x) { // Explicit conversion from DBInt to int. Throws an exception if the public static explicit operator int(DBInt x) { public static DBInt operator +(DBInt x) { public static DBInt operator -(DBInt x) { public static DBInt operator +(DBInt x, DBInt y) { public static DBInt operator -(DBInt x, DBInt y) { public static DBInt operator *(DBInt x, DBInt y) { public static DBInt operator /(DBInt x, DBInt y) { public static DBInt operator %(DBInt x, DBInt y) { public static DBBool operator ==(DBInt x, DBInt y) { public static DBBool operator!=(DBInt x, DBInt y) { public static DBBool operator >(DBInt x, DBInt y) { public static DBBool operator <(DBInt x, DBInt y) { public static DBBool operator >=(DBInt x, DBInt y) { public static DBBool operator <=(DBInt x, DBInt y) { public override bool Equals(object obj) { public override int GetHashCode() { public override string ToString() { 11.4.2 Логический тип базы данных Представленная ниже структура DBBool реализует трехзначный логический тип. Возможными значениями этого типа являются значения DBBool.True, DBBool.False и DBBool.Null, где член Null указывает неизвестное значение. Подобные трехзначные логические типы часто используются в базах данных. using System; public struct DBBool public static readonly DBBool Null = new DBBool(0); // Private field that stores –1, 0, 1 for False, Null, True. sbyte value; // Private instance constructor. The value parameter must be –1, 0, or 1. DBBool(int value) { // Properties to examine the value of a DBBool. Return true if this public bool IsNull { get { return value == 0; } } public bool IsFalse { get { return value < 0; } } public bool IsTrue { get { return value > 0; } } // Implicit conversion from bool to DBBool. Maps true to DBBool.True and public static implicit operator DBBool(bool x) { // Explicit conversion from DBBool to bool. Throws an exception if the public static explicit operator bool(DBBool x) { // Equality operator. Returns Null if either operand is Null, otherwise public static DBBool operator ==(DBBool x, DBBool y) { // Inequality operator. Returns Null if either operand is Null, otherwise public static DBBool operator!=(DBBool x, DBBool y) { // Logical negation operator. Returns True if the operand is False, Null public static DBBool operator!(DBBool x) { // Logical AND operator. Returns False if either operand is False, public static DBBool operator &(DBBool x, DBBool y) { // Logical OR operator. Returns True if either operand is True, otherwise
|