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

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

25 голосов
/ 16 января 2009

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

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

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

Ответы [ 8 ]

51 голосов
/ 16 июня 2010

Разница в том, что они делают разные вещи!

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

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

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

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

Огромная разница, ребята. Помните, что дело не только в состоянии, но и в потоке.

17 голосов
/ 16 января 2009

Давайте посмотрим ... Как ни странно, "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 
}
14 голосов
/ 16 января 2009

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

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

6 голосов
/ 16 января 2009

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

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

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

1 голос
/ 16 января 2009

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

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

0 голосов
/ 30 мая 2019

Когда активированы Инструменты / Параметры / Текстовый редактор / Все языки / Объектив кода, Счетчик ссылок отображается над каждым оператором Sub, Function или Property.

«Возвращаемое значение» кажется лучше, чем «присвоение значения имени функции». В последнем случае «Кодовая линза» производит завышенный счетчик ссылок.

' Code Lens reports "0 references" here for Sub Rosa().
Public Sub Rosa()
    Diagnostics.Debug.WriteLine(Test())
    Diagnostics.Debug.WriteLine(Test2())
End Sub

' Code Lens reports "2 references" here for Function Test().
Public Function Test() As String
    Test = "Test"       ' Code Lens counts this as a reference.
End Function

' Code Lens reports "1 reference" here for Function Test2().
Public Function Test2() As String
    Dim strTest2 as String = "Test"
    Return strTest2     ' Code Lens does NOT count this as a reference.
End Function
0 голосов
/ 15 апреля 2019

это очень удобно при работе со сторонними фабриками (_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
0 голосов
/ 22 августа 2012

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

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

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

...