2015-08-24 7 views
1

Мне интересно, правильно ли это сделать. У меня есть этот пример кода, который должен представлять собой действие пользователя и вычисление, выполненное в функции, эта функция должна затем вернуть значение в мой суб?Как использовать функцию return

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim i As Integer = 1 
    Test_function(i) 
    MsgBox(i) 
End Sub 

Private Function Test_function(ByVal i As Integer) 
    i = i + 1 
    Return (i) 
End Function 

Когда я запускаю этот кусок кода я получаю:

я = 1 в суб

я = 2 в функции

я = 1 в подпункте?

Как вы можете получить i = 2 в моем суб? Или это не правильный способ использования этого?

+1

'Dim myVar = Test_function (i)' MyVar будет удерживать возвращаемое значение - ваш код не имеет никакого значения для захвата/удержания/сохранения возврата – Plutonix

+0

Вы также можете написать «i = Test_function (i)» – ChicagoMike

+0

О, я вижу, получил это сейчас! спасибо за комментарии! – JefE

ответ

4

Я думаю, что вы спрашиваете, почему i не могут быть изменены вызовом Test_function.

Давайте сломаем ваш код.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim i As Integer = 1 'creating a variable named i, value 1. 
    Test_function(i) 'passing the value of the variable i to test function, but not doing anything with what the function returns. 
    MsgBox(i) 'calling messagebox with the value i. 
End Sub 

Private Function Test_function(ByVal i As Integer) 'creating a new variable also named i with the value being passed in. 
    i = i + 1 'incrementing the value of the i variable by 1. 
    Return (i) 'returning i 
End Function 

Таким образом, существует несколько концепций, которые вы недоразумение, насколько я могу tell-, что ByVal средства, возможно, понятие области видимости переменной, а также то, что Return делает.

Очевидным ответом является то, что вы не используете значение, возвращаемое Test_function. Если у вас i = test_Function(i), то i будет увеличиваться на призыв Test_function

Другой подход должен был бы пройти i ByRef вместо ByVal-, если вы сделали это, i в рамках вашего метода Test_function будет таким же, как i в рамках вашего метода Button1_Click. Но поскольку вы передаете его ByVal, переменные i на самом деле являются двумя совершенно разными переменными.

+0

Итак, поправьте меня, если я ошибаюсь, используйте ByRef, если вы хотите отредактировать значение переменной и вернуть его и использовать ByVal для использования значения, но не возвращаете его? Это лучший способ использовать это? – JefE

+0

Нет, ByRef vs ByVal просто управляет, если вы передаете значение или передаете ссылку. Если вы передадите ссылку, оба метода будут искать одинаковое расположение памяти, а модификации вызываемого метода будут отражены в вызывающем методе независимо от того, возвращается ли это значение. Если вы передадите значение, изменения в вызываемом методе не отразятся на вызывающем методе. Однако это может означать разные вещи, если то, что вы передаете, - это класс против примитива, такого как целое число. Читайте это -> https://msdn.microsoft.com/en-us/library/eek064h4.aspx –

+0

Обратите внимание, что по умолчанию в VB все - ByVal, поэтому 'Test_Function (ByVal i As Integer)' совпадает с ' TestFunction (i As Integer) ' –

1

Нечего удивляться, это простое недоразумение. вы печатаете фактическое значение i, если вы звоните так:

MsgBox(Test_function(i)) 

Тогда оба будут такими же; или вы можете проверить это следующим образом:

Dim tempVal = Test_function(i)'<-- will give 2 
MsgBox(i)'<--- will give 1 

это потому, что вы передаете значение i я не в качестве ссылки, если вы передаете его в качестве эталона, то и оба будут одинаковыми. Так что если вы измените сигнатуру функции следующим образом:

Private Function Test_function(ByRef i As Integer) 
    i = i + 1 
    Return (i) 
End Function 

же вызов функции даст вам оба значения, как 2

Dim tempVal = Test_function(i)'<-- will give 2 
MsgBox(i)'<--- will give 2 

Reference ByVal and ByRef

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