2016-01-21 2 views
2

Я пишу функцию, которая принимает внешнюю процедуру Sub и запускает ее определенное количество раз на основе переменных в содержащемся классе. Как передать Sub devs в качестве параметров в VB.NET? Или что это альтернативный способ сделать это? (UPDATE: это для класса таймера для приложения WPF, которое я буду использовать в моей игре «Понг», которую я создаю. Новый метод должен принять вспомогательную процедуру как параметр, а затем он сообщает другому подкатегорию Run() для выполнения этого подпрограммы процедура каждые x миллисекунд)Как передать подпроцедуру как аргумент VB.NET

+1

Цикл, как правило, используется для обработки чего-то несколько раз, но вы на самом деле не очень много для нас. –

+1

Вы ищете [Action Delegate] (https://msdn.microsoft.com/en-us/library/system.action (v = vs.110) .aspx). Существует также делегат 'Func' для случаев, когда метод возвращает что-то [как показано здесь] (http://stackoverflow.com/a/33571567/1070452) – Plutonix

+0

Я знаю, что мне нужно использовать цикл здесь, но мне нужно передать в пользовательской подпроцедуре. Таким образом, вызов этой функции будет loopCommandBasedOnUnAccessibleData (printHelloWorld()), и он будет печатать «Hello World» переменную # раз –

ответ

2

Вы можете объявить свой метод (Sub) как принимающий параметр Action Delegate. Это позволяет передать адрес метода ничтожного (HelloWorld) в качестве параметра:

Private Sub DoSomething(a As Action) 
    ' pick a random number 1-5 
    Dim v = RNG.Next(1, 6) 
    ' call whatever v times 
    For n As Int32 = 0 To v 
     a() 
    Next 
End Sub 

Private Sub HelloWorld() 
    Console.WriteLine("Null Spark says 'Hello, World!'") 
End Sub 

Назвать это будет просто:

DoSomething(AddressOf HelloWorld) 

В MSDN примечаний, Action инкапсулирует метод, который не имеет никаких параметров и не возвращает значение. Для включения параметров используйте Action(of T) (см. Следующий); для возврата значения (используйте функцию), используйте Func, see this example


При наличии PARAMS участвующего использования Action(Of T). Вы также можете объявлять переменные, как Action Delegates, которые могут сделать код более удобным для чтения:

Private HelloAction As Action(Of Int32) 

Тогда где-то, как форма нагрузки:

HelloAction = AddressOf HelloWorld 
... 
Private Sub DoSomething(a As Action(Of Int32)) 
    Dim v = RNG.Next(1, 6) 
    For n As Int32 = 0 To v 
     a(n)   ' pass the int param 
    Next 
End Sub 

В этом случае HelloWorld будет:

Private Sub HelloWorld(x As Integer) 
+0

Большое спасибо :) Это, честно говоря, ОГРОМНАЯ помощь для меня. –

Смежные вопросы