В итоге появляется возможность проверки, присутствует ли одно из значений в объединенном значении. Например, если вы хотите выяснить, имеется ли значение
ContactPreference
в переменной
emailAndPhone
, то можете написать такой код:
Console.WriteLine("None? {0}", (emailAndPhone |
ContactPreferenceEnum.None) == emailAndPhone);
Console.WriteLine("Email? {0}", (emailAndPhone |
ContactPreferenceEnum.Email) == emailAndPhone);
Console.WriteLine("Phone? {0}", (emailAndPhone |
ContactPreferenceEnum.Phone) == emailAndPhone);
Console.WriteLine("Text? {0}", (emailAndPhone |
ContactPreferenceEnum.Text) == emailAndPhone);
В результате выполнения кода в окне консоли появляется следующий вывод:
None? False
Email? True
Phone? True
Text? False
Понятие структуры (как типа значения)
Теперь, когда вы понимаете роль типов перечислений, давайте посмотрим, как использовать структуры .NET Core. Типы структур хорошо подходят для моделирования в приложении математических, геометрических и других "атомарных" сущностей. Структура (такая как перечисление) — это определяемый пользователем тип; тем не менее, структура не является просто коллекцией пар "имя-значение". Взамен структуры представляют собой типы, которые могут содержать любое количество полей данных и членов, действующих на таких полях.
На заметку! Если вы имеете опыт объектно-ориентированного программирования, тогда можете считать структуры "легковесными типами классов", т.к. они предоставляют способ определения типа, который поддерживает инкапсуляцию, но не может использоваться для построения семейства взаимосвязанных типов. Когда возникает потребность в создании семейства типов, связанных отношением наследования, необходимо применять классы.
На первый взгляд процесс определения и использования структур выглядит простым, но, как часто бывает, самое сложное скрыто в деталях. Чтобы приступить к изучению основ типов структур, создайте новый проект по имени
FunWithStructures
. В языке C# структуры определяются с применением ключевого слова
struct
. Определите новую структуру по имени
Point
, представляющую точку,
которая содержит две переменные типа
int
и набор методов для взаимодействия с ними:
struct Point
{
// Поля структуры.
public int X;
public int Y;
// Добавить 1 к позиции (X, Y).
public void Increment
{
X++; Y++;
}
// Вычесть 1 из позиции (X, Y).
public void Decrement
{
X--; Y--;
}
// Отобразить текущую позицию.
public void Display
{
Console.WriteLine("X = {0}, Y = {1}", X, Y);
}
}
Здесь определены два целочисленных поля (
X
и
Y
) с использованием ключевого слова
public
, которое является модификатором управления доступом (их обсуждение будет продолжено в главе 5). Объявление данных с ключевым словом
public
обеспечивает вызывающему коду возможность прямого доступа к таким данным через переменную типа
Point
(посредством операции точки).
На заметку! Определение открытых данных внутри класса или структуры обычно считается плохим стилем программирования. Взамен рекомендуется определять закрытые данные, доступ и изменение которых производится с применением открытых свойств. Более подробные сведения приведены в главе 5.
Вот код, который позволяет протестировать тип
Point
:
Console.WriteLine("***** A First Look at Structures *****\n");
// Создать начальную переменную типа Point.
Point myPoint;
myPoint.X = 349;
myPoint.Y = 76;
myPoint.Display;
// Скорректировать значения X и Y.
myPoint.Increment;
myPoint.Display;
Console.ReadLine;
Вывод выглядит вполне ожидаемо:
***** A First Look at Structures *****
X = 349, Y = 76
X = 350, Y = 77
Создание переменных типа структур
Для создания переменной типа структуры на выбор доступно несколько вариантов. В следующем коде просто создается переменная типа
Point
и затем каждому ее открытому полю данных присваиваются значения до того, как обращаться к членам переменной. Если не присвоить значения открытым полям данных (
X
и
Y
в данном случае) перед использованием структуры, то компилятор сообщит об ошибке: