VB.NET Structs und Nichts - Probleme
Ich habe einige Kopfschmerzen mit Strukturen und Funktionen, die Nichts zurückgeben in VB.NET.
Lassen Sie mich versuchen zu erklären, hier mit diesem 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
In den vorherigen code, wenn ich Nichts zurück als Ergebnis der Foo-Funktion, die ich erwarten würde, dass st ist Nichts. Aber das ist nicht das, was passiert.
Dann fand ich in der MSDN-Dokumentation:
Nichts zuweisen, um eine variable, wird der Standardwert für seine deklarierte Typ. Wenn dieser Typ enthält variable Mitglieder, Sie sind alle auf Ihre Standardwerte festgelegt.
Also ich habe festgestellt, dass wenn ich diesen Nichts auf eine Struktur, die alle seine Mitglieder werden auf Ihre Standardwerte festgelegt, statt der struct selbst.
Außerdem habe ich versucht, st eine Nullable-Typ, indem Sie erklärt:
Dim st As Nullable(Of Test) = Foo()
aber noch kann ich nicht überprüfen, ob st ist Nichts mit:
If st Is Nothing Then
oder
If st.Equals(Nothing) Then
So, Fragen:
1 - Ist es möglich, zuweisen Nichts, um die Struktur und nicht auf seine Mitglieder?
2 - Wie kann ich prüfen, ob ein return struct Wert ist Nichts?
InformationsquelleAutor RHaguiuda | 2010-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Struktur ist ein Werttyp, es kann nicht Nichts sein. Die Nullable-Typ kann Ihr problem lösen, setzen Sie ein Fragezeichen hinter dem Typ-Namen, um es kurz und bissig. Hier ist ein Beispiel:
Die ? ist die Abkürzung für
Nullable(Of Test)
.Passant: Keine Möglichkeit, Sie zu betrügen. Meine Antwort ist so viel besser! :O)
Sorry @übel, das ist ein bisschen die Frage, wo "nur noch ein Fragezeichen" Hände die OP die Lösung. Sicher deine ausführliche Antwort erhalten viele mehr upvotes als mir in den nächsten 10 Jahren. Besser überprüfen Sie, dass IsEmpty Theorie aber.
Passant: Kann man über stackoverflow.com/questions/3169102/... und einen Kommentar über die Zuordnung einer temp-variable vor dem Aufruf von Invoke und warum ist es eine gute Idee. Von einer früheren exchange von uns Wochen, ich habe eine technisch falsche Bemerkung, verursacht eine Flut weiterer Kommentare.
InformationsquelleAutor Hans Passant
Den ersten beiden folgenden Methoden werden Häufig in den .NET-Framework. Die Methode, die Sie verwenden, hängt von Ihren Anforderungen. Ich werde mit Methode #3, wenn die Struktur getestet selten. Für häufige Tests, ich werde verwenden Sie Methode 1, wenn Methode #2 ist nicht geeignet für "leer" zu testen. Zum Beispiel, die
Point
Struktur definiert einen leeren Punkt {x=0,y=0}, wobei ich nicht glaube, richtig ist. Deshalb würde ich die erste Methode verwenden, in meinem point-Struktur Umsetzung.Methode 1: Definieren
Empty
Test für den Vergleich-TestsHinzufügen eines freigegebenen
Test
verwenden Sie für eine leer-Vergleich.Test:
Methode 2: Definieren Sie
IsEmpty
Eigenschaft für die PrüfungDefinieren
IsEmpty
- Eigenschaft basierend auf der Struktur des internen Zustands.Test:
Methode 3: Verwendung Von Nullable(Of T)
Definieren als:
Test:
Hinweis
Habe ich nicht getestet, den obigen code, und ich habe keinen Zugriff auf meine code-Bibliothek.
Inspiration
Werfen Sie einen Blick auf Microsoft ' s
Point
undColor
Strukturen, mit den veröffentlichten source-code oder mithilfe .NET Reflector.InformationsquelleAutor AMissico
Gibt es keinen solchen Begriff, wie die Zuordnung "Nichts an der Struktur und nicht auf seine Mitglieder".
Es klingt sehr viel, wie Sie sein sollte betrachten nullable value types und
Nullable(Of T)
- wenn Sie brauchen, um in der Lage sein zu vertreten, das fehlen einer "echten" Wert für Wert geben, das ist genau der Grund, warum es erfunden wurde.Betrachten
Byte
zum Beispiel. EinByte
Wert haben kann jeder der 256 Werte (0-255). Falls Sie weisen Sie ihm den WertNothing
, dass es wirklich schaffen, Sie 0. Es kann es nicht "irgendein Wert nicht im Bereich von 0-255", wie es gespeichert werden soll als byte -. Ich halte es für etwas unglücklich, dass VB hat lassen SieNothing
hier, eigentlich... denn philosophisch eine "missing" - Wert und dem Wert 0 sind sehr verschiedene Dinge, in der Tat.Sowieso, nullable value types wrap "normalen" Wert-Typen und bieten eine zusätzliche Boolesche Wert zu sagen, ob es wirklich ein brauchbarer Wert vorhanden ist oder nicht.
InformationsquelleAutor Jon Skeet