Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Давайте взглянем на это...Странно, что "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 
}

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

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

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

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

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

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

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

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

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

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

" Возвращаемое значение " кажется лучше, чем " присвоение значения имени функции " ;. В последнем случае & Quot; Code Lens & Quot; производит завышенный счетчик ссылок.

' 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top