C # vs VB.NET -manipulation des Structures nulles

j'ai couru à travers ceci et je me demandais si quelqu'un pourrait expliquer pourquoi cela fonctionne en VB.NET quand je m'attendais à ce qu'il échoue, tout comme il le fait dans 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 en VB.NET ...

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

n'Est pas la même que la valeur null ( Rien != null-LOL?) , ou s'agit-il simplement de façons différentes de gérer la même situation entre les deux langues?

Pourquoi ou ce qui est manipulé de manière différente entre les deux qui fait de ce bien dans l'un, mais pas l'autre?

[mise à Jour]

étant donné certains des commentaires, j'ai encore un peu trafiqué avec ça... il semble comme si vous devez réellement utiliser Nullable si vous voulez permettre à quelque chose d'être null dans VB.NET... 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...

23
demandé sur Mark Hurd 2008-11-20 00:50:35

5 réponses

si je me souviens bien,"rien" dans VB signifie "la valeur par défaut". Pour un type de valeur, c'est la valeur par défaut pour un type de référence, qui serait nulle. Ainsi, attribuer rien à une structure, n'est pas un problème du tout.

30
répondu BFree 2008-11-19 21:55:10

Nothing est à peu près équivalent à default(T) pour le type pertinent. (Vient de vérifier, et ceci est vrai pour les chaînes aussi bien - i.e. Nothing est une référence nulle dans le contexte des chaînes.)

12
répondu Jon Skeet 2008-11-19 22:34:40

j'ai essayé de le chercher sur MSDN mais je n'ai rien trouvé d'intéressant du côté de la VB. Lors de la recherche de "struct" sur C#, il retourne clairement que c'est un Type de valeur et ne peut pas être assigné à null since... c'est une valeur.

Cependant, en regardant VB.NET le mot-clé "Structure "ne dit pas"Type de valeur". Au lieu de cela, il est écrit

l'énoncé de Structure définit type de valeur composite que vous pouvez personnaliser.

So... l'objet?

c'est mon avis. J'aimerais avoir des références à ce comportement mais je n'en ai pas trouvé.

1
répondu Maxime Rouiller 2008-11-19 22:01:19

aussi, les structures sont des types de valeurs (un peu comme int, char, etc.) et sont donc non nullable.

0
répondu Dana 2008-11-19 22:00:23

parce qu'une Structure est composée de plusieurs types différents (pas un seul type de valeur, mais un possible composite de plusieurs types différents), demander si elle est "rien" briserait la logique de l'utilisation de "rien". Rien ne teste différemment selon le type que vous testez et donc un type complexe n'adhère pas à la logique de L'utilisation de "rien". Toutefois, pour ce type d'essai, c'est-à-dire avec une structure ayant tous ses éléments constitutifs à leur respectivement" rien " valeurs, nous utilisons la fonction "rien". 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
0
répondu piBoss 2013-06-29 04:03:18