- •Классы и структуры
- •Функции-члены
- •Передача параметров в методы
- •Параметры ref
- •Параметры out
- •Свойства
- •Свойства, доступные только для чтения и только для записи
- •Модификаторы доступа для свойств
- •Автоматически реализуемые свойства
- •Замечание о встраивании
- •Индексаторы
- •Тип_элемента this[int индекс]
- •Листинг 1.
- •Листинг 2.
- •Листинг 3.
- •Листинг 4.
- •Конструкторы
- •Статические конструкторы
- •Вызов одних конструкторов из других
- •Поля readonly
- •Анонимные типы
- •Структуры
- •Структуры это типы значений
- •Структуры и наследование
- •Конструкторы структур
- •Частичные классы
- •Статические классы
- •Класс Object
- •Методы System.Object
- •Метод ToString()
- •Расширяющие методы
Конструкторы структур
Объявлять конструкторы структур можно точно так же, как это делается для классов, за исключением того, что не разрешено определять конструкторы без параметров. Это может показаться бессмысленным, но причина кроется в реализации исполняющей среды .NET. Бывают некоторые редкие случаи, когда .NET не в состоянии вызвать определенный вами конструктор без параметров. В Microsoft двинулись по пути наименьшего сопротивления, просто запретив пользовательские конструкторы без параметров для структур в С#.
Таким образом, конструктор по умолчанию, который инициализирует все поля нулевыми значениями, всегда присутствует неявно, даже если применяются другие конструкторы с параметрами. Также невозможно обойти конструктор по умолчанию, определяя начальные значения полей. Следующий код вызовет ошибку компиляции:
struct Dimensions
{
public double Length = 1;
// Ошибка. Начальные значения не разрешены,
public double Width = 2;
// Ошибка. Начальные значения не разрешены.
}
Конечно, если бы Dimensions была объявлена классом, этот код скомпилировался бы без проблем.
Аналогично, структуру можно снабдить методом Close() или Dispose() так же, как это делается с классами.
Частичные классы
Ключевое слово partial (частичный) позволяет определить класс, структуру или интерфейс, распределенный по нескольким файлам. Однако в ситуации, когда множеству разработчиков требуется доступ к одному и тому же классу, или же (что более вероятно) в ситуации, когда некоторый генератор кода генерирует часть класса, такое разделение класса на несколько файлов может оказаться полезным.
Ключевое слово partial просто помещается перед классом, структурой или интерфейсом. В следующем примере класс TheBigClass размещается в двух отдельных файлах: BigClassPartl.cs и BigClassPart2.cs.
// BigClassPartl.cs
partial class TheBigClass
{
public void MethodOne()
{
}
}
// BigClassPart2.cs
partial class TheBigClass
{
public void MethodTwo()
{
}
}
Когда компилируется проект, частью которого являются эти два файла, создается единый тип TheBigClass с двумя методами MethodOne() и MethodTwo().
Если в описании класса используется любое из перечисленных ниже ключевых слов, оно должно быть повторено во всех его частях, находящихся в разных файлах:
-
public
-
private
-
protected
-
internal
-
abstract
-
sealed
-
new
-
общие ограничения
Вложенные части также допускаются, до тех пор, пока ключевое слово partial предшествует ключевому слову class во вложенном типе. Атрибуты, XML-комментарии, интерфейсы, параметры обобщенных типов и члены всех частей частичного класса компилируются в единый тип. Предположим, что есть два исходных файла:
// BigClassPartl.cs
[CustomAttribute]
partial class TheBigClass : TheBigBaseClass, IBigClass
{
public void MethodOne()
{
}
}
// BigClassPart2.cs
[AnotherAttribute]
partial class TheBigClass : IotherBigClass
{
public void MethodTwoO
{
}
}
После компиляции эквивалентный исходный файл получится таким:
[CustomAttribute]
[AnotherAttribute]
partial class TheBigClass:TheBigBaseClass,IBigClass,OtherBigClass
{
public void MethodOne()
{
}
public void MethodTwo()
{
}
}