VB.NET les Structures et Rien - problèmes
Je vais avoir quelques maux de tête à l'aide de Structures et de fonctions qui ne retournent Rien dans VB.NET.
Laissez-moi vous expliquer ici avec ce code:
Public Class Form1
Structure Test
Dim field1 As String
End Structure
Private Function Foo() As Test
Return Nothing
End Function
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim st As Test = Foo()
End Sub
End Class
Dans le code précédent, quand je retourne à Rien comme résultat de la fonction Foo je m'attends que st est Rien. Mais ce n'est pas ce qui se passe.
Ensuite, j'ai trouvé dans la documentation MSDN:
Attribution de Rien à une variable définit la valeur par défaut pour son type déclaré. Si ce type contient des variables membres, ils sont tous définis à leurs valeurs par défaut.
Donc j'ai découvert que lorsque je attribuer Rien à une structure, tous ses membres sont fixés à leurs valeurs par défaut, au lieu de la structure elle-même.
Aussi, j'ai essayé de faire st un type Nullable en déclarant:
Dim st As Nullable(Of Test) = Foo()
mais, là encore, je ne peux pas vérifier si st n'en est Rien, en utilisant:
If st Is Nothing Then
ou
If st.Equals(Nothing) Then
Donc, des questions:
1 - Est-il possible d'attribuer Rien à la structure et non à ses membres?
2 - Comment puis-je vérifier si un retour struct valeur est Rien?
OriginalL'auteur RHaguiuda | 2010-07-02
Vous devez vous connecter pour publier un commentaire.
Une structure est un type de valeur, il ne peut pas être Rien. Le type Nullable peut résoudre votre problème, placez un point d'interrogation après le nom du type pour faire court et accrocheur. Voici un exemple:
L' ? est coupé court pour
Nullable(Of Test)
.Passant: Aucune façon, vous trichez. Ma réponse est tellement mieux! :O)
Désolé @ne va pas, c'est un peu la question, où "il suffit d'ajouter un point d'interrogation" les mains de l'OP la solution. Sûrement votre réponse détaillée obtiendrez beaucoup plus upvotes que le mien au cours des 10 prochaines années. Mieux de vérifier que la fonction IsEmpty théorie.
Passant: tu Peux aller sur stackoverflow.com/questions/3169102/... et de faire un commentaire au sujet de l'assignation d'une variable temp avant d'appeler, Invoquer et pourquoi il est une bonne idée. Lors d'un précédent échange de la nôtre il y a des semaines, j'ai fait techniquement incorrect commentaire qui a provoqué une avalanche de commentaires des autres.
OriginalL'auteur Hans Passant
La première des deux méthodes suivantes sont utilisées fréquemment dans le .NET Framework. La méthode que vous utilisez dépendra de vos besoins. Je vais utiliser la Méthode #3 si la structure testée rarement. Pour des tests fréquents, je vais utiliser la Méthode #1 si la Méthode #2 n'est pas appropriée pour "vider" les tests. Par exemple, le
Point
structure définit un point vide {x=0,y=0}, qui je ne pense pas que c'est correct. Donc, je voudrais utiliser la première méthode, à mon point de structure de mise en œuvre.Méthode 1: Définir
Empty
de Test pour le Test de ComparaisonAjouter partagé
Test
à utiliser pour un vide-comparaison.Test:
Méthode 2: Définir
IsEmpty
Propriété pour les TestsDéfinir un
IsEmpty
propriété en fonction de la structure interne de l'état.Test:
Méthode 3: Utilisation De Nullable(T)
Définir comme:
Test:
Remarque
Je n'ai pas testé le code ci-dessus et je n'ai pas accès à mon code sous-bibliothèque.
Inspiration
Prendre un coup d'oeil à Microsoft
Point
etColor
structures, à l'aide de leur code source ou à l'aide de .NET Réflecteur.OriginalL'auteur AMissico
Il n'y a pas de concept que l'affectation d' "Rien à la structure et non à ses membres".
Il a l'air très bien, vous devriez être à la recherche à nullable types de valeur et
Nullable(T)
- si vous avez besoin d'être capable de représenter l'absence d'une "véritable" valeur pour un type de valeur, c'est précisément la raison pour laquelle il a été inventé.Envisager
Byte
par exemple. UnByte
valeur peut avoir l'une des 256 valeurs (de 0 à 255). Si vous affectez-lui la valeurNothing
, qui va vraiment faire 0. Il ne peut pas le faire "à quelques pas de valeur dans la plage de 0 à 255" car il va être stocké comme un octet. Je considère qu'il est quelque peu regrettable que VB ne vous permettent d'utiliserNothing
ici, en fait... parce que du point de vue philosophique d'un "manque" de la valeur et de la valeur 0 sont des choses très différentes en fait.De toute façon, nullable types de valeur wrap "normal" types de valeur et de fournir une valeur Booléenne pour dire si il y a vraiment une valeur d'utilité ou non.
OriginalL'auteur Jon Skeet