Хотелось бы понять, можно ли поместить в массивы 3 отдельные функции, как в примере:
Public Class Form1
Dim Data_Out As Integer
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Attention
'These instructions are not true, they are only used to explain the problem!
'Array funciont:
'Process(2) as Function
'Process(0) = Function_A
'Process(1) = Function_B
'Process(2) = Function_C
End Sub
Private Sub Function_A(Data_A As Integer, Data_B As Integer)
Data_Out = Data_A + Data_B
End Sub
Private Sub Function_B(Data_A As Integer, Data_B As Integer)
Data_Out = Data_A - Data_B
End Sub
Private Sub Function_C(Data_A As Integer, Data_B As Integer)
Data_Out = Data_A * Data_B
End Sub
End Class
Хотелось бы понять, возможно ли это сделать.
Инициализируйте переменную в массиве и «перенесите» одну функцию с ее параметрами.
Все 3 функции имеют одинаковые и не разные входные параметры.
Можно ли это сделать?
Можно ли это сделать с помощью функций с разными входными параметрами?
Спасибо вам и всем за помощь!
Я пытался поискать в сети, но ничего не нашел. :(
VB.NET Function
должен Return
передавать данные. Создание переменной уровня класса и манипулирование ею в нескольких подсистемах/функциях обязательно приведет к ошибкам.
.NET позволяет создавать делегаты, которые по сути представляют собой объекты со ссылкой на метод. Вы можете передавать делегат, как и любой другой объект, а затем вызывать делегат для выполнения метода, на который он ссылается. Вот как вы можете выполнять методы в местах, которым ничего не известно об объекте, членом которого является метод.
Одним из наиболее распространенных применений делегатов является обработка событий. Событие — это, по сути, собрание делегатов. Регистрация обработчика событий включает в себя создание делегата для метода, который будет обрабатывать событие, и передачу его объекту, который вызывает событие. При возникновении события вызывается каждый делегат и выполняются обработчики событий.
В вашем случае вы можете сделать это:
Dim methods(2) As Action(Of Integer, Integer)
methods(0) = AddressOf Function_A
methods(1) = AddressOf Function_B
methods(2) = AddressOf Function_C
methods(0)(2, 3)
MessageBox.Show(Data_Out.ToString())
methods(1)(2, 3)
MessageBox.Show(Data_Out.ToString())
methods(2)(2, 3)
MessageBox.Show(Data_Out.ToString())
Вы увидите, что каждый метод будет выполняться по очереди. Вы даже можете разместить точки останова на этих методах, чтобы увидеть их выполнение в отладчике.
Платформа уже содержит множество типов делегатов, и вы также можете определить свои собственные, но в большинстве случаев проще всего использовать делегат Action
или Func
. Вы используете Action
для методов, которые не возвращают значение, т. е. Sub
, и Func
для методов, которые возвращают значение, т. е. Function
. Оба могут иметь до 16 параметров универсального типа, поэтому могут поддерживать методы с количеством параметров до 16. В приведенном выше примере ваши методы не возвращают значение и имеют два параметра типа Integer
, поэтому я использовал Action(Of Integer, Integer)
. Если, например, вы имели дело с методами с параметрами типа Double
, Integer
и String
, возвращающими Boolean
, вы бы использовали Func(Of Double, Integer, String, Boolean)
. И т. д.
Я предлагаю вам немного почитать о делегатах в целом. Лямбда-выражения также создают делегаты, но они создают делегаты для анонимных методов, а не для именованных методов. Они часто используются в LINQ, а также и в других местах.
Спасибо! Я ответил вам ниже! Я не могу заставить код работать с помощью оператора Func.
@MizzardNet7Net7 Func(Of Integer, Integer, Integer)
. Подпись включает тип возвращаемого значения и типы аргументов.
@MizzardNet7Net7, пожалуйста, потратьте некоторое время в Справочном центре, чтобы узнать, как работает этот сайт. Это сайт вопросов и ответов, а не форум. Вы задаете один вопрос, а затем люди дают на него ответ. Вы не публикуете ответ в ответ на ответ. Если требуется обсуждение, вы оставляете комментарий к ответу и, если это необходимо. обновите свой вопрос. Вы говорите: «Я попробовал, и это работает», а это означает, что этот ответ касается вопроса, который вы на самом деле задали, поэтому примите его и двигайтесь дальше. Если у вас появился новый вопрос, опубликуйте его как новый вопрос, а не как ответ на этот вопрос.
Ваш вопрос не может быть о VBA и Visual Studio. Я предполагаю, что ваш язык — VB.Net. Пожалуйста, установите теги соответствующим образом. Если ваш вопрос касается не только VStudio 2012 (кстати, довольно старой версии), удалите этот тег.