Могу ли я определить оператор присваивания в структуре vb.net? - PullRequest
0 голосов
/ 09 июля 2010

У меня есть структура, которая на самом деле представляет собой простой байт с большей функциональностью.

Я определил это так:

Structure DeltaTime

    Private m_DeltaTime As Byte
    Public ReadOnly DeltaTime As Byte
        Get
            Return m_DeltaTime
        End Get
    End Property

End Structure

Я хочу иметь эти две функции:

Public Sub Main
    Dim x As DeltaTime = 80 'Create a new instance of DeltaTime set to 80
    Dim y As New ClassWithDtProperty With { .DeltaTime = 80 }
End Sub

Есть ли способ достичь этого?

Если бы существовал способ наследовать от структуры, я бы просто наследовал от байта, добавляя свою функциональность, в основном мне просто нужна байтовая структура с пользовательской функциональностью.

Мой вопрос также действителен, когда вы хотите определить свои новые типы значений одноэлементных членов (например, вы хотите определить nibble-тип, например, и т. Д.), И вы хотите иметь возможность задать его с назначением числа или другое типизированное представление языка.

Другими словами, я хочу иметь возможность определить следующую структуру Int4 (клев) и использовать ее следующим образом:

Dim myNibble As Int4 = &HF 'Unsigned

1 Ответ

2 голосов
/ 09 июля 2010

Создайте оператор преобразования, например,

Structure DeltaTime

    Private m_DeltaTime As Byte
    Public ReadOnly Property DeltaTime() As Byte
        Get
            Return m_DeltaTime
        End Get
    End Property

    Public Shared Widening Operator CType(ByVal value As Byte) As DeltaTime
        Return New DeltaTime With {.m_DeltaTime = value}
    End Operator

End Structure

ОБНОВЛЕНИЕ:

Для предложенного вами типа Int4 я настоятельно рекомендую сделать его Narrowingоператор вместо.Это заставляет пользователя вашего кода выполнять явное приведение, что является визуальным указанием на то, что назначение может завершиться ошибкой во время выполнения, например

Dim x As Int4 = CType(&HF, Int4) ' should succeed
Dim y As Int4 = CType(&HFF, Int4) ' should fail with an OverflowException
...