Question

Je me suis heurté à cela et je me demandais si quelqu'un pourrait expliquer pourquoi cela fonctionne dans VB.NET alors que je m'attendais à ce qu'il échoue, comme c'est le cas en C #

//The C# Version

struct Person {
    public string name;
}
...
Person someone = null; //Nope! Can't do that!!
Person? someoneElse = null; //No problem, just like expected

Mais alors dans VB.NET ...

Structure Person
    Public name As String
End Structure
...
Dim someone As Person = Nothing 'Wha? this is okay?

Nothing est-il différent de null ( Nothing! = null - LOL?) , ou s'agit-il simplement de manières différentes de gérer la même situation entre les deux langues?

Pourquoi ou ce qui est traité différemment entre les deux qui rend cela acceptable dans l'un, mais pas dans l'autre?

[Mise à jour]

Compte tenu de certains commentaires, je me suis un peu plus amusé avec cela ... on dirait que vous devez réellement utiliser Nullable si vous voulez autoriser que quelque chose soit nul dans VB.NET ... donc par exemple ... .

'This is false - It is still a person'
Dim someone As Person = Nothing
Dim isSomeoneNull As Boolean = someone.Equals(Nothing) 'false'

'This is true - the result is actually nullable now'
Dim someoneElse As Nullable(Of Person) = Nothing
Dim isSomeoneElseNull As Boolean = someoneElse.Equals(Nothing) 'true'

Trop bizarre ...

Était-ce utile?

La solution

Si je me souviens bien, rien dans VB signifie "la valeur par défaut". Pour un type de valeur, il s'agit de la valeur par défaut, pour un type de référence, ce serait null. Ainsi, n’affecter rien à une structure ne pose aucun problème.

Autres conseils

Nothing est à peu près équivalent à default (T) pour le type concerné. (Juste vérifié, et cela vaut également pour les chaînes - c.-à-d. Nothing est une référence null dans le contexte des chaînes.)

J'ai essayé de le rechercher sur MSDN mais je n'ai rien trouvé de pertinent du côté VB. Lors de la recherche de " struct " en C #, il retourne clairement qu'il s'agit d'un type de valeur et ne peut pas être affecté d'une valeur nulle car ... c'est une valeur.

Toutefois, lors de la recherche sur le mot clé VB.NET "Structure". il ne dit pas "Type de valeur". Au lieu de cela, il est écrit

  

L'instruction Structure définit un   type de valeur composite que vous pouvez   personnaliser.

Alors ... objet?

Ce serait ma supposition. J'aimerais avoir des références à ce comportement, mais je n'en ai trouvé aucun.

De plus, les structures sont des types valeur (un peu comme int, char, etc.) et sont donc non nullables.

Puisqu’une structure est composée de plusieurs types différents (pas un seul type de valeur, mais éventuellement un composite de plusieurs types), il est donc possible de demander si elle correspond à "Rien". briserait la logique d’utilisation de "Rien". Rien ne teste différemment en fonction du type que vous testez et, par conséquent, un type complexe n'adhère pas à la logique d'utilisation de "Rien". Cependant, pour ce type d’essai, c’est-à-dire avec une structure ayant tous les membres qui le composent à leur "néant" respectif. valeurs, nous utilisons la fonction "IsNothing". Par exemple:

Public Class Employees
    Public Structure EmployeeInfoType
       Dim Name As String    ' String
       Dim Age as Integer    ' Integer
       Dim Salary as Single  ' Single
    End Structure

    Private MyEmp as New EmployeeInfoType

    Public Function IsEmployeeNothing(Employee As EmployeeInfoType) As Boolean
       If **IsNothing**(Employee) Then
          Return True
       Else
          Return False
       End If
    End Function
End Class
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top