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?

 8
Author: Reddy, 2017-05-26

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
 9
Author: SSS, 2017-11-15 15:04:36

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))

 4
Author: Fabio, 2017-11-16 15:46:17
A versão final da resposta aceita responde corretamente à pergunta. No entanto, Fabio adicionou algumas informações úteis à sua resposta, mas tem uma série de informações e conceitos incorretos. Então esta resposta é uma tentativa de fundir as duas respostas em uma mais completa com a informação correta.

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:

As comparações numéricas não tratam nada como 0. Comparações de cadeias de caracteres não tratam nada como "" (uma cadeia vazia).

Porque é que isso está a acontecer na VB? Isso acontece porque VB usa a palavra-chave 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))
 2
Author: Racil Hilan, 2017-11-15 20:33:42

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

 1
Author: Mad Myche, 2017-05-26 02:12:55

A referência da Microsoft está certa, diz

Representa o valor por omissão de qualquer tipo de dados.

Mas não estava suficientemente claro para mim até ter criado um VB.NET aplicação de consola com o seguinte código:
    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

 0
Author: Ivanzinho, 2018-08-02 15:17:26