2010-01-29 2 views
4

Хорошо, я укоренялся в одном из наших корпоративных приложений, которое сделано на VB.net. Я не знаком с VB.net (я делаю вещи на C#), поэтому я задаю этот вопрос: Выполняет ли код после комментария очистки?Заявления или выражения будут выполняться после оператора return в VB.net?

Public Function DoesUserHavePermission(ByVal UserID As Integer, ByVal ActionID As Integer) As Boolean 
    ' some extra code re: getting data 


    Return UserHasPermission 

    '-Clean Up- 
    MySqlCommand.Dispose() 
    MySqlConnection.Dispose() 
    RowCount = Nothing 


End Function 

Это мое понимание, как только вы произнесите возврат, вы снова дадите управление вызовами. Это странность VB.Net, которую я должен принять или гигантский WTF?

+2

Определенно wtf..maybe новый программист или стажер, который был брошен в .net, не зная об этом ... – JonH

+0

Yah, похоже, OMFG WTFAYT. –

ответ

8

Заявления после комментария очистки не выполняются. Это кандидат для приложения в Try/Catch/finally.

+2

или просто попробуйте/Наконец – kd7

+0

Вот что я подумал. VB.net достаточно странно, где я должен был задать вопрос. – KeithA

+0

или 'Использование', если переменные являются локальными – MarkJ

1

Не, если нет какой-то логики управления вы опустили в вашем примере

1

Код должен быть (очистку, что есть), завернутые внутрь, наконец, заявление с помощью исключения попытки поймать:

псевдо:

try 
    'make conn 
catch exception 
finally 
mysqlCmd.Dispose 
.... 
end try 

Возможно ли, что он все еще будет работать ... возможно ... Я использовал для записи VB.net, и это было довольно давно, но я помню такие странности. Я не могу дать вам верный ответ, так как это была очень плохая практика. Что вы можете сделать, это очистить его и установить некоторые точки останова в нашем коде и отладить. Посмотрите, возвращается ли код к нему ...

0

Это для меня гигантская WTF и очень сложная вещь, которую можно пропустить, как правило, просмотр кода сверстников может поймать это, я не понимаю, почему возвращается функция из функции ранее до очистки. Это можно было бы сделать во время тестирования кода, где программист хотел сначала проверить функцию, и решил проигнорировать код очистки, быстро вернувшись от него, я подозреваю, что код очистки может быть длинным, т.е. возможно, это бросает исключение, которое не попадает должным образом и хочет игнорировать его, поэтому необходимо немедленно вернуться ... Это (un) преднамеренный побочный эффект введения утечки, поскольку ресурс не очищается должным образом, тем самым маскируя реальную проблема ... это мое взятие на себя.

Надеюсь, это поможет, С уважением, Tom.

1

Короткий ответ: Код ниже возврата никогда не будет выполнен.

Это выглядит как переведенный код. Как и кто-то взял фрагмент C# из Интернета и попытался записать его в VB для VS 2003 (до того, как VB поддерживал оператор USING, но в то время как C#).

, где MySqlConnection и MySqlCommand являются новыми, должны быть помещены в ИСПОЛЬЗОВАНИЕ блоков, а линии Dispose() превращены в END USING.

Если возможно, используйте ИСПОЛЬЗОВАНИЕ ПО ПОВРЕЖДЕНИЮ/НАКОНЕЧНО, чтобы обеспечить очистку объектов IDisposable.

using mySqlConnection as New SqlConnection(connectionString) 
    mySqlConnection.Open 
    using mySqlCommand as New SqlCommand(commandString, mySqlConnection) 
     'do something that may fail' 

     return UserHasPermission 

    end using 'disposes mySqlCommand' 
end using 'closes/disposes mySqlConnection' 

Вы также можете использовать этот шаблон для SqlTransactions. (Место после mySqlConnection.Open)

using myTerribleVariableName as SqlTransaction = mySqlConnection.BeginTransaction 
    'do something that may fail - multiple SqlCommands maybe' 
    'be sure to reference the transaction context in the SqlCommand' 

    myTerribleVariableName.Commit 
end using 'disposes. rollsback if not commited' 

О, и вы можете удалить RowCount = Nothing заявление.

0

Представленный код ничего не сделает после оператора возврата. VB.NET и C# похожи в этом порядке.

Возможно, этот код был написан программистом VB6, которому доверяли старые парадигмы, или, возможно, это была работа инструмента обновления, портируя код с VB6 на VB.NET.

+0

Является ли это функцией VB6? Нет, это новая база кода. Но ответственный программист - с фона VB6. – KeithA

+0

Да, вы могли бы уйти с этим в VB6. Я не думаю, что тогда это была хорошая идея. –

+0

Вы не могли уйти с этим в VB6. Недостижимый код не выполняется. Хотя VB6 имеет детерминированную доработку, поэтому иногда не требуется утилизация ресурсов. – MarkJ

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