Подтвердить что ты не робот

Возврат функции VB.NET

Чтобы вернуть значение из функции VB.NET, можно присвоить значение "Имя функции" или использовать "возвращаемое значение".

Я иногда вижу, что эти смешанные в одной и той же функции. Лично я предпочитаю возвращение.

Мой вопрос в том, какая внутренняя разница, если таковая имеется, между двумя?

4b9b3361

Ответ 1

Там, вероятно, нет разницы. IIRC, сгенерированный компилятором IL преобразует их оба в операторы Return, если только нет дополнительного использования переменной _returnValue.

На мой взгляд, читаемость назначения FunctionName плохая и является примером плохой привычки VB6. Я также предпочитаю метод переменных _returnValue (НЕ RETVAL).

Ответ 2

Разница в том, что они РАЗЛИЧНЫЕ ВЕЩИ!

"Возвращаемое значение" делает 2 вещи:
1. Он устанавливает возвращаемое значение функции в этой точке 2. Он немедленно выходит из функции

Никакой код в функции не выполняется!

'Functionname = value' делает 1 вещь: 1. Он устанавливает возвращаемое значение функции в этой точке

Другой код в функции продолжает выполняться Это позволяет дополнительной логике уточнять или отменять возвращаемое значение функции

Огромные люди различия. Помните это не все о состоянии, это также о потоке.

Ответ 3

Давайте посмотрим... Как ни странно, "functionName =" генерирует меньше IL?

код:

Public Function Test() As String
    Test = "Test"
End Function


Public Function Test2() As String
    Return "Test"
End Function

IL:

.method public static string Test() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: ret 
}

.method public static string Test2() cil managed
{
    .maxstack 1
    .locals init (
        [0] string Test2)
    L_0000: nop 
    L_0001: ldstr "Test"
    L_0006: stloc.0 
    L_0007: br.s L_0009
    L_0009: ldloc.0 
    L_000a: ret 
}

Ответ 4

Выполнение следующих действий предоставляется только для разработчиков Visual Basic 6.0, чтобы легко переносить код:

Public Function MyFunction() As String
    MyFunction = "Hello"
End Function

Я бы определенно не рекомендовал делать это, если в ваш проект входит любой, кто не работал с Visual Basic 6.0, так как этот синтаксис будет путать.

Ответ 5

99 раз из 100 я буду использовать "возвращаемое значение".

Время от времени у меня будет функция, в которой другой тип не только позволяет мне сохранять объявление переменной, но и делать это так, чтобы на самом деле значительно разъяснить функцию. Обычно это происходит, когда я хотел бы назвать возвращаемое значение таким же, как и в любом случае, и часто это рекурсивные функции; что-то об этой конструкции придает ей неявную возвращаемую переменную. Однако этот сценарий встречается крайне редко. Я не знаю, есть ли у меня какие-либо функции, использующие неявные возвращаемые переменные вообще в моем текущем проекте.

Ответ 6

Прочитав, что синтаксисом возвращаемого значения является One True .NET Способ делать вещи, которые я думал: "Хорошо, мы сделаем это так тогда". Затем я написал функцию, которую я знал, с сердцем KNEW, вернул либо значение из оператора Return, либо, альтернативно, Exception при любых обстоятельствах, и все еще получил предупреждение компилятора о том, что функция "не возвращает значение на всех путях",.

К счастью, я столкнулся с вопросом о переполнении стека Как я могу заставить эту функцию генерировать предупреждение "не возвращает значение для всех путей" ?, в котором объясняется, почему; добавление присвоения значения по умолчанию к имени процедуры во главе функции также предотвратило предупреждение в моем случае.

Следовательно, хотя я буду продолжать использовать синтаксис возвращаемого значения просто для согласования синтаксиса, я также назначу значение по умолчанию для имени функции, чтобы предотвратить возможность загромождения процесса компиляции с помощью фиктивные предупреждения.

Ответ 7

это очень удобно при работе со сторонними фабриками (_hsf), вы можете избежать объявления возвращаемых переменных

Public Function CreateExtremum(iShape As INFITF.Reference, iDir1 As HybridShapeTypeLib.HybridShapeDirection, iSide1 As Integer, iDir2 As HybridShapeTypeLib.HybridShapeDirection, iSide2 As Integer, iDir3 As HybridShapeTypeLib.HybridShapeDirection, iSide3 As Integer) As HybridShapeTypeLib.HybridShapeExtremum
    CreateExtremum = _hsf.AddNewExtremum(iShape, iDir1, iSide1)
    CreateExtremum.Direction2 = iDir2
    CreateExtremum.ExtremumType2 = iSide2
    CreateExtremum.Direction3 = iDir3
    CreateExtremum.ExtremumType3 = iSide3
    CreateExtremum.Compute()
End Function