C # vs VB.NET - Gestion des structures nulles
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 ...
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