Respostas:
Não, não há equivalente da out
palavra - chave em VB.
No entanto, o VB inicializa automaticamente todas as variáveis locais em um método, então você pode usar ByRef
sem precisar inicializar explicitamente a variável primeiro.
Exemplo:
Sub Main()
Dim y As Integer
Test(y)
End Sub
Sub Test(ByRef x As Integer)
x = 42
End Sub
(Se você examinar o código na estrutura (por exemplo, Double.ExperimenteParse ), poderá ver os <OutAttribute>
parâmetros adicionados, mas isso só faz diferença quando a chamada é encaminhada para interoperabilidade COM ou invocação de plataforma.)
ByRef
parâmetros. (Isso não acontece com parâmetros de tipo de valor.)
Nothing
a eles, o aviso será eliminado, embora não altere o resultado.
Nothing
a eles até agora. É muito demorado porque estou tendo que fazer isso centenas de vezes em um grande site legado. Obrigado por investigar.
Out
atributo não é equivalente à out
palavra-chave C # .
Não, não há construção equivalente que permite que uma variável não inicializada seja passada para um método sem um aviso, mas, como mencionei na minha pergunta e resposta especificando um <Out()>
atributo em uma ByRef
definição de parâmetro, embora VB ignore isso, é tratado por C # como um out
parâmetro.
Portanto, eu pré-inicializaria as variáveis de referência para Nothing
e especificaria <Out()> ByRef
para significar a intenção (isso funcionará se os usuários C # alguma vez acessarem seus métodos).
Se você sentir que sabe quando pretende acessar o padrão Nothing
em variáveis de referência não atribuídas, você pode definir a "Configuração de aviso" "Uso da variável antes da atribuição" para "Nenhum" no nível do projeto (Propriedades do projeto> Compilar, e provavelmente deseja definir a configuração para "Todas as configurações" antes de alterar esta configuração), ou, no VS2015 (VB.NET 14), você pode usar #Disable Warning BC42030
.
Versão C #
void TestFunc(int x, ref int y, out int z) {
x++;
y++;
z = 5;
}
Versão Vb.net
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
x += 1
y += 1
z = 5
End Sub
Atualizar
Conforme declarado no comentário, não se esqueça de inicializar seu parâmetro que será usado no slot de saída
Eu tive o problema no VB.NET que chamei uma função "por ref" que passou um array de volta.
Mesmo que o compilador tenha sinalizado isso como um aviso, tudo bem. A correção é super simples e provavelmente uma boa prática de programação.
eu mudei
Dim m_arr_values() as Integer
fnRetArray(m_arr_values)
para
' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing
fnRetArray(m_arr_values)
Também ajuda na codificação se os nomes das variáveis forem descritivos ...
Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
...
End Sub
Você pode usar o método de passagem por referência em VB.NET.
Você precisa do mecanismo de parâmetro Out em C #, porque ele não permite que você use nenhuma variável sem inicializá-la.
O VB.NET não precisa de uma palavra-chave especial, pois ele o faz automaticamente.
Basta usar ByRef.
O VB tem o atributo que deve ser igual ao C # out, mas hoje você ainda recebe um aviso mesmo se usá-lo. Existem detalhes sobre como consertá-lo na área vblang do github. https://github.com/dotnet/vblang/issues/67 .
Object
, por isso não pode ser usada para umByRef x As Integer
parâmetro).