Рейтинг@Mail.ru

Создание методов расширения на VB.NET

Print Friendly, PDF & Email

Методы расширения – это методы, которые не относятся непосредственно к классу, но добавляют ему специфическую функциональность. Такая возможность может пригодиться, если, например, нет исходного кода для некоего класса, но нужно дополнить его функциональность. Или в случае, когда вы не хотите нарушить работу существующего кода, но при этом вам нужно некое дополнительное поведение.

Рассмотрим пример. Создадим на VB.NET класс, который будет являться расширением для типа System.Byte(). Добавим типу System.Byte() два метода. Первый метод будет обращать порядок следования битов байта. Например, число 0010_0101 при обращении станет числом 1010_0100. То есть наименее значащий бит теперь станет наиболее значащим, и наоборот. Это полезный метод, который часто используется в таких задачах как, например, вычисление контрольной суммы некоторого массива чисел.

Namespace ByteUtils

''' <summary>
''' Изменяет порядок следования битов в числе на обратный.
''' </summary>
<Extension()>
Public Shared Function ReverseBits(b As Byte) As Byte
    Dim res As Byte = AllBytesArray(b)
    Return res
End Function

''' <summary>
''' Массив, в котором хранятся 255 значений, где по индексу элемента возвращается соответствующее число с обратным порядком битов.
''' </summary>
''' <remarks>Разумеется, эту задачу можно решить и по-другому. Но в данном примере мы просто создадим таблицу, из которой будем брать нужное значение.</remarks>
Private Shared AllBytesArray As Byte() = {0, 128, 64, 192, 32, 160, 96, 224, 16, 144, 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, 95, 223, 63, 191, 127, 255}

End Namespace '/ByteUtils

Как использовать данный метод расширения? Во-первых, необходимо импортировать то пространство имён, в котором он объявлен, в свой проект:

Imports ByteUtils

После этого метод должен появиться в средстве IntelliSense. Теперь для любого числа типа System.Byte() в вашем коде достаточно написать следующее:

Dim a As Byte = 142 'a = 1000_1110 в двоичном представлении
Dim b As Byte = a.ReverseBits() 'b = 0111_0001 в двоичном представлении

И вы получите байт с обратным порядком следования битов. На что здесь следует обратить внимание.

  1. Атрибут Extension. Этот атрибут даёт понять компилятору, что данный метод – это метод расширения.
  2. Метод объявлен как Shared (эквивалент static из C#). Все методы расширения должны быть объявлены как статические. Или можете весь класс сделать статическим – сделайте не класс, а Module.
  3. Входной параметр и выходное значение должны быть одного типа. И этот тип должен быть типом, который мы расширяем. В данном случае – System.Byte().
  4. Входной параметр метода расширения – это и есть то число, над которым производится действие.
  5. При вызове метода расширения никакие параметры ему не передаются.

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

''' <summary>
''' Выполняет операцию ИСКЛЮЧАЮЩЕЕ ИЛИ с заданым числом.
''' </summary>
<Extension()>
Public Function XorWith(b As Byte, value As Byte) As Byte
    Return (b Xor value)
End Function

Используем созданный метод расширения таким образом:

Dim a As Byte = 123
Dim c As Byte = a.XorWith(34)

Что здесь важно:

  1. Первый параметр метода расширения – это всегда то число, над которым будет производиться действие самого метода.
  2. Последующие параметры – это параметры, которые будут переданы методу как собственно, параметры.
  3. При вызове метода расширения с параметрами метод будет иметь на 1 меньшее число параметров, чем указано в сигнатуре самого метода, т.к. первый параметр – это всегда сам объект, над которым производится действие метода.

Поделиться

Print Friendly, PDF & Email