Я думаю, что существует недопонимание того, что AddressOf действительно делает и чем является на самом деле.
AddressOf просто хранит АДРЕС ПАМЯТИ для вызываемой функции или метода.Прочитайте о делегатах .NET, и вы поймете концепцию, но суть в том, чтобы понять, что делегатом является: тип в .NET для хранения АДРЕСОВ ПАМЯТИ методов.Только то.Хранит ли переменная делегата какой-либо метод?Нет, не какой-либо метод, только методы, подпись которых совпадает с заявлением делегата.
И тогда вы должны узнать о концепции событий, которая очень привязана к делегатам просто потому, что событие должно знать, чтоDelegate будет обрабатывать это (кто является EventHandler, который является делегатом)
Теперь вы упомянули что-то из невозможности передать аргументы в AddressOf.Это твое недоразумение.Вы не передаете никакие аргументы в AddressOf, потому что вы напрямую передаете адрес памяти методу или функции, и этот метод или функция уже будет содержать аргументы в соответствии с его объявлением.
Так что, когда вы найдете что-то вроде:
AddHandler button.click, AddressOf mysub
то, что вы говорите компилятору: «Я знаю, что кнопка, вызываемая кнопкой, имеет возможность инициировать события при нажатии на нее. Поэтому я хочу обработать (делегировать действие, которое происходит) этособытие click с методом mysub, где бы оно ни находилось в памяти .. "
mysub - метод, который будет выполняться при нажатии кнопки.
Вам было интересно, какие аргументы передать иликак передать аргументы.ВЫ не передаете никаких аргументов, потому что это будет событие нажатия кнопки, которое передаст эти аргументы.Вы можете просто обрабатывать параметры, которые метод mysub получает от кнопки.
А как узнать, какие параметры mysub должен получить от кнопки?Потому что они ДОЛЖНЫ быть теми, которые определены в определении делегата.Помните, что мы говорили, что переменные-делегаты не хранят адреса памяти для какого-либо метода, а только для методов, сигнатура которых соответствует определению делегата, присоединенного к событию кнопки click
Итак, перейдите к определению события Button, и вы обнаружите, что оно использует тип делегата.Посмотрите на подпись этого делегата, и вы будете точно знать, какие типы аргументов используются в методах этого хранилища делегатов.
Тем не менее, в соответствии с передовой практикой события должны быть присоединены к делегатам, чья подпись (подпись метода, которую он может хранить) содержит 2 аргумента:
Первый аргумент - отправитель, объект, который сгенерировал событие.Таким образом, это
sender as Object
Второй аргумент - это объект, который оборачивает любой другой параметр дополнительной информацией, объект должен быть EventArgs (или наследовать его)
e as EventArgs
Как конкретный ответ.Если вы хотите, чтобы альтернатива передавала адрес памяти метода, который будет обрабатывать событие нажатия вашей кнопки, просто не передавайте адрес памяти и не используйте содержимое такой функции, как:
AddHandler button.click, Sub (ByVal sender As Object, ByVal e As System.EventArgs, ByVal str As String)
'do something here
End Sub
в этом случае вы сказали бы компилятору: «когда кнопка с именем Button генерирует событие click, я хочу, чтобы вы выполнили этот анонимный (без имени) метод. И поскольку я знаю, что событие click кнопки передает 2 аргумента, введитепервый аргумент в моей переменной отправителя и второй аргумент в моей переменной EventArgs "