Язык программирования C#9 и платформа .NET5
Использование перечислений, флагов и побитовых операций
Побитовые операции предлагают быстрый механизм для работы с двоичными числами на уровне битов. В табл. 4.3 представлены побитовые операции С#, описаны их действия и приведены примеры.
Чтобы взглянуть на побитовые операции в действии, создайте новый проект консольного приложения по имени
. Поместите в файлFunWithBitwiseOperationsследующий код:Program.csusing System;using FunWithBitwiseOperations;Console.WriteLine("===== Fun wih Bitwise Operations");Console.WriteLine("6 & 4 = {0} | {1}", 6 & 4, Convert.ToString((6 & 4),2));Console.WriteLine("6 | 4 = {0} | {1}", 6 | 4, Convert.ToString((6 | 4),2));Console.WriteLine("6 ^ 4 = {0} | {1}", 6 ^ 4, Convert.ToString((6 ^ 4),2));Console.WriteLine("6 << 1 = {0} | {1}", 6 << 1, Convert.ToString((6 << 1),2));Console.WriteLine("6 >> 1 = {0} | {1}", 6 >> 1, Convert.ToString((6 >> 1),2));Console.WriteLine("~6 = {0} | {1}", ~6, Convert.ToString(~((short)6),2));Console.WriteLine("Int.MaxValue {0}", Convert.ToString((int.MaxValue),2));Console.readLine();Ниже показан результат выполнения этого кода:
===== Fun wih Bitwise Operations6 & 4 = 4 | 1006 | 4 = 6 | 1106 ^ 4 = 2 | 106 << 1 = 12 | 11006 >> 1 = 3 | 11~6 = -7 | 11111111111111111111111111111001Int.MaxValue 1111111111111111111111111111111Теперь, когда вам известны основы побитовых операций, самое время применить их к перечислениям. Добавьте в проект новый файл по имени
и приведите его код к такому виду:ContactPreferenceEnum.csusing System;namespace FunWithBitwiseOperations{[Flags]public enum ContactPreferenceEnum{None = 1,Email = 2,Phone = 4,Ponyexpress = 6}}Обратите внимание на атрибут
. Он позволяет объединять множество значений из перечисления в одной переменной. Скажем, вот как можно объединитьFlagsи:PhoneContactPreferenceEnum emailAndPhone = ContactPreferenceEnum.Email |ContactPreferenceEnum.Phone;В итоге появляется возможность проверки, присутствует ли одно из значений в объединенном значении. Например, если вы хотите выяснить, имеется ли значение
в переменнойContactPreference, то можете написать такой код:emailAndPhoneConsole.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? FalseEmail? TruePhone? TrueText? FalseПонятие структуры (как типа значения)
Теперь, когда вы понимаете роль типов перечислений, давайте посмотрим, как использовать структуры .NET Core. Типы структур хорошо подходят для моделирования в приложении математических, геометрических и других "атомарных" сущностей. Структура (такая как перечисление) — это определяемый пользователем тип; тем не менее, структура не является просто коллекцией пар "имя-значение". Взамен структуры представляют собой типы, которые могут содержать любое количество полей данных и членов, действующих на таких полях.
На заметку! Если вы имеете опыт объектно-ориентированного программирования, тогда можете считать структуры "легковесными типами классов", т.к. они предоставляют способ определения типа, который поддерживает инкапсуляцию, но не может использоваться для построения семейства взаимосвязанных типов. Когда возникает потребность в создании семейства типов, связанных отношением наследования, необходимо применять классы.
На первый взгляд процесс определения и использования структур выглядит простым, но, как часто бывает, самое сложное скрыто в деталях. Чтобы приступить к изучению основ типов структур, создайте новый проект по имени
. В языке C# структуры определяются с применением ключевого словаFunWithStructures. Определите новую структуру по имениstruct, представляющую точку, которая содержит две переменные типаPointи набор методов для взаимодействия с ними:intstruct Point{
