Null (Em C#) Vs nada (em vb.net)
Como É Que C# NULL é diferente de vb.net nada?
Console.WriteLine(Nothing = "") => True
Vs
Console.WriteLine(null==""); => False
o meu entendimento foi que ambos null
e {3]} são iguais. Mas acima do Código claramente explica que não é.
Qual é o equivalente a C # null
em VB.NET?
5 answers
Em seu código, VB adivinha que você está comparando String
s, uma vez que um dos operandos é um String
. Em String
comparações, Nothing
é equivalente ao vazio String
""
. Em seguida, faz uma comparação de valor, que retorna True
.
Utilizar Is
para comparar referências:
Console.WriteLine(Nothing Is "") '=> False
Escolheu um pequeno exemplo complicado para testar a diferença entre Nothing
em vb.net e null
Em c#
Da especificação Visual basic language sobre Nothing
:
Nada é um literal especial; não tem um tipo e é convertíveis para todos os tipos do sistema de tipo, incluindo tipo parametro. quando convertido para um determinado tipo, é o equivalente ao valor por defeito desse tipo .
Se ler a descrição de expressões de valor predefinidas da documentação da Microsoft, irá reparar que Nothing
em vb.net e default(T)
Em C# têm um comportamento semelhante.
Por exemplo
Dim isSomething As Boolean = Nothing ' = False
Dim amount As Integer = Nothing ' = 0
Dim value As String = Nothing ' = null (notice not empty string!)
Como prova que o valor por omissão para o texto não é um texto vazio, dado que muitos dos comentários/respostas aqui permanecem
Dim value As String = Nothing
If value.Equals("") Then ' will throw NullReferenceException
End If
Comparar Nothing
com o texto vazio ""
com "="
o operador é um caso especial para vb.net, Porque Nothing
para string irá avaliar para null
Da especificação linguística Visual basic sobre os operadores relacionais para o tipo String
:
Os operadores devolvem o resultado da comparação dos dois valores usando uma comparação binária ou uma comparação de texto. A comparação utilizada é determinado pelo ambiente de compilação e pela opção comparar instrucao. Uma comparação binária determina se o Unicode numérico o valor de cada caractere em cada cadeia é o mesmo. Uma comparação de texto será que uma comparação de texto Unicode baseada na cultura atual em uso em o .net Framework. Ao fazer uma comparação de texto, uma referência nula é equivalente ao texto literal "" .
Para verificar a igualdade de caracteres em vb.net deve utilizar o método String.Equals
ou o operador Is
.
Com base nas especificações linguísticas acima indicadas
O meu entendimento era que tanto nulas como nada são iguais. Mas acima o código explica claramente que não é.
Eles não são iguais, Nothing
em vb.net é equivalente a default(T)
em C#
Qual é o equivalente a C# null em VB.NET?
Em C# Você não pode definir null
para tipos de valor, por isso para tipos de Referência (String
) equivalente para C# null
em vb.net será Nothing
Por exemplo (null == default(String))
Em Primeiro Lugar, Nothing
em VB é equivalente a null
Em C#, então a sua compreensão disso é correta, pelo menos parcialmente (porque isso é apenas um uso da palavra-chave Nothing
). Tem sido refletido em toda a literatura MSDN, embora tenha desaparecido recentemente e tenha sido substituído pela palavra null
em muitos comentários. Sua confusão surge do comportamento e características do VB que diferem de C# e programadores que estão vindo de outras línguas e não experimentados em VB ficam confusos pelos resultados.
Como indicado na resposta aceita, a pergunta é considerada uma comparação de string por VB porque um dos operandos é uma string. Em comparações de cordas, VB trata Nothing
o mesmo que o texto vazio ""
como por MSDN:
Porque é que isso está a acontecer na VB? Isso acontece porque VB usa a palavra-chaveAs comparações numéricas não tratam nada como 0. Comparações de cadeias de caracteres não tratam nada como "" (uma cadeia vazia).
Nothing
para duas coisas diferentes (semelhante a como ele usa o operador =
para duas coisas diferentes, atribuição e comparação). A primeira utilização é equivalente a null
Em C# como mencionei acima. Segundo a utilização é equivalente ao operador default(T)
Em C#. Como com o operador =
, o VB sabe de que forma usar Nothing
dependendo do contexto. Exemplos:
Nesta linha, o VB usa Nothing
Como null
:
Console.WriteLine(s Is Nothing) //C#: (s == null)
Nestas linhas, o VB usa Nothing
como default(T)
para atribuir o valor por omissão à variável:
Dim s As String = Nothing //C#: string s = default(string);
Dim i As Integer = Nothing //C#: int i = default(int);
Finalmente, ao comparar variáveis de diferentes tipos, VB e c# convertem um operando para corresponder ao tipo do outro operando. Por exemplo, se comparar inteiro. Ambos VB e C# retornarão true
para esta linha:
Console.WriteLine(5.0 = 5) //C#: (5.0 == 5)
No entanto, VB e C# diferem em que tipos podem ser convertidos para o quê. Além disso, a cadeia vazia ""
e null
são tratadas da mesma forma em comparações de cadeias em VB, mas não em C#. Isso torna as coisas mais fáceis na maioria dos casos, que é algo conhecido sobre VB em geral. Então você pode facilmente testar se o seu texto não tem nenhum valor como este:
Console.WriteLine(s = Nothing)
Console.WriteLine(s = "")
Ambas as linhas irão retornar o mesmo resultado porque o VB trata Nothing
como ""
para comparação. Em C#, Você não pode fazer isso e você tem que testar para ambos assim:
Console.WriteLine(s == null && s == "")
Obviamente, VB é mais fácil e mais curto que c# neste caso, que é o mais comum. No entanto, isso vem à custa de perder algum controle. Nos casos menos comuns em que você só quer testar para referência nula, C# torna-se obviamente melhor porque você ainda pode usar o operador ==
:
Console.WriteLine(s == null)
Enquanto estiver em VB, não pode utilizar o operador =
e tem de utilizar outro, o Is
operador:
Console.WriteLine(s Is Nothing)
Também embora VB seja mais fácil no ponto anterior, C# é mais claro. Por isso, do ponto de vista da clareza do Código, esta linha pode ser usada em ambos os idiomas com o mesmo resultado:
Console.WriteLine(string.IsNullOrEmpty(s))
Nothing
em VB varia de acordo com o tipo de objectos:
- Os tipos de referência equivalem a nulo
- Os tipos de valor correspondem ao valor por omissão; o qual para um tipo NULL é null
A referência da Microsoft está certa, diz
Mas não estava suficientemente claro para mim até ter criado um VB.NET aplicação de consola com o seguinte código:Representa o valor por omissão de qualquer tipo de dados.
Dim myText As String = Nothing
Dim myInt As Integer = Nothing
Dim myFloat As Single = Nothing
Dim myBoolean As Boolean = Nothing
Dim myDate As DateTime = Nothing
Descompilou-o usando o ILSpy e o código resultante foi:
string myText = null;
int myInt = 0;
float myFloat = 0f;
bool myBoolean = false;
DateTime myDate = DateTime.MinValue;
Só existe Nothing
literal para indicar um valor nulo em VB.NET.
De C # {[3] } é equivalente a VB Nothing