VB.NET поддерживает перегрузку операторов, что позволяет определить пользовательское поведение для стандартных операторов (+, -, =, <, >, и др.) при работе с собственными типами. Это достигается с помощью ключевого слова Operator и объявления специального метода в классе или структуре.
Пример (перегрузка оператора "+"):
Public Structure Vector2D Public X As Double Public Y As Double Public Sub New(x As Double, y As Double) Me.X = x Me.Y = y End Sub Public Shared Operator +(a As Vector2D, b As Vector2D) As Vector2D Return New Vector2D(a.X + b.X, a.Y + b.Y) End Operator End Structure
Ограничения и правила:
Public Shared (статические).= для присваивания, только для сравнения).Ошибка — двусмысленность: перегрузка операторов делает код "магическим": собеседники могут не догадаться, почему складываются пользовательские объекты.
Почему невозможно переопределить оператор присваивания ":=" или "=", а только оператор сравнения "=" в Visual Basic .NET?
Ответ:
В VB.NET оператор присваивания (=) не может быть перегружен, только оператор сравнения. Это соответствует семантике и архитектуре языка — перегрузить правила работы базового оператора присваивания нельзя, т.к. это нарушает базовую логику языка. А вот оператор сравнения (равенства) можно перегрузить для своих типов:
Public Shared Operator =(a As MyClass, b As MyClass) As Boolean Return a.ID = b.ID End Operator
История
История
История
В проекте с векторной алгеброй перегрузили все возможные операторы, включая сравнения, не реализовав также GetHashCode и Equals. Хеш-таблицы и SortedList стали вести себя некорректно: объекты не искались по ключам, нарушалась работа коллекций.