2009-08-11 4 views
3

In VB.NET erklärt, warum kann ich nicht sehen, ein Mitglied einer Struktur, wenn ich es ein Nullable Type zu machen?Kann nicht Mitglieder eine Struktur sehen, wie auf NULL festlegbare

Beispiel:

Public Structure myNullable 
    Dim myNullVar As Integer 
End Structure 

Sub Main() 
    Dim myInstance As myNullable 'This works. 
    Dim myNullableInstance? As myNullable 'This works. 
    myInstance.myNullVar = 1 'This works.  
    myNullableInstance.myNullVar = 1 'This doesn't work. 
End Sub 
+0

was machst du das braucht eine struktur? Ich sehe nicht viel von einer Verwendung für Strukturen für die meisten. NET-Programme, vor allem Menschen lernen. NET – Maslow

+0

Was machst du das würde nicht funktionieren mit Dim myNullVar Als 'Integer?' in einer Klasse eingewickelt? oder als der Wert, den Sie weitergeben, wenn dies alles ist, was die Struktur enthält. – Maslow

Antwort

3

Wie andere gesagt haben, müssen Sie die Value Eigenschaft verwenden, um der Wert holen. System.Nullable<T> ist jedoch unveränderlich - die Eigenschaft Value ist schreibgeschützt. Es wird eine Kopie des Werts zurückgegeben, also selbst wenn Sie das Feld ändern könnten, würde es nicht tun, was Sie wollen.

Das ist eigentlich eine gute Sache - Werttypen sollte unveränderlich sein. Veränderbare Strukturen sind schrecklich - wenn die Tatsache, dass Nullable<T> es schwierig macht, Ihren Typ zu verwenden, Sie auf die Unveränderlichkeits-Route drückt, ist das großartig.

Sie Ihr Feld ist schreibgeschützt, und einen Konstruktor fügen Sie den Wert passieren zu lassen. Dann, anstatt zu versuchen, den nullbaren Wert zu ändern, weisen Sie der Variablen einen ganz neuen Wert zu.

+0

Ah bizarre Strukturprobleme, ein anderer Grund, warum ich Strukturen nicht mag. – Maslow

+1

Während ich Strukturen kaum selbst schreibe, ist das Problem wirklich mit * veränderbaren * Strukturen hier. –

+0

Ich hatte veränderliche Strukturen, die mich vorher gebissen haben, und da ich keine Ahnung hatte, was vor sich ging, wechselte ich die Wortstruktur in die Klasse. und plötzlich funktionierte mein Code. Also habe ich versuchende Strukturen aufgegeben. – Maslow

-1

Wenn ein Typ NULL-Werte zulässt Sie sollen zu überprüfen, ob es einen Wert hat, dann nur diesen Wert zugreifen, wenn es einen gibt:

if(myNullableInstance.hasValue) 
myNullableInstance.value.myNullVar=1 
+0

Ich bekomme diesen Fehler, wenn ich das versuche: "Ausdruck ist ein Wert und kann daher nicht das Ziel einer Zuweisung sein." – Pliskin

+0

Ja, es scheint, dass mein Wissen über Strukturen seit dem Wechsel zur Objektorientierung fast nicht existiert. Beantworten Sie meine Fragen, die von der Basispost kommentiert wurden? – Maslow

+0

Liebe den Sarkasmus. – Pliskin

0

Weil Die Nullable<T> Struktur legt den zugrunde liegenden Wert über die Value Eigenschaft offen. Daher müssen Sie:

myNullableInstance.Value.myNullVar = 1 
+0

Ich bekomme diesen Fehler, wenn ich versuche: "Ausdruck ist ein Wert und kann daher nicht das Ziel einer Aufgabe sein." – Pliskin

1

Wie andere Antworten festgestellt haben, können Sie den inneren Wert eines nullable mit .Wert zugreifen. Aber sie schlagen Ihnen vor, myNullableInstance.Value.myNullVar = 1 zu machen, was nicht funktioniert.

, dass wegen der Art und Weise Strukturen Arbeit ist. Wenn Sie ein Mitglied einer Struktur ändern, wird eine neue Strukturinstanz erstellt. Dies ist in diesem Fall nicht möglich, da dadurch die Value-Eigenschaft der Nullable-Klasse geändert würde, was nicht direkt erfolgen kann, da Value ReadOnly ist. obwohl

Dies funktionieren würde:

Dim myInstance as myNullable 
myInstance.myNullVar = 1 
myNullableInstance = myInstance 
0

Es macht Sinn, dass dies tut nicht Arbeit:

myNullableInstance.Value.myNullVar = 1 

Grundsätzlich würden Sie zu einem gewissen Kopie der Struktur werden die Zuordnung, die zurückgegeben wurde von die Value-Eigenschaft.

Es ist nicht wirklich ein Problem, weil normalerweise Strukturen unveränderlich als Best Practice gemacht werden. Sie könnten dies mit einigen Aufgaben hin und her umgehen, aber wie andere geschrieben haben, sollten Sie stattdessen eine Klasse überdenken. Auf diese Weise benötigen Sie auch keine Nullable, da Sie einfach eine Nullreferenz verwenden können.

0

Nullable structres ist ein Schmerz, und es gibt keinen guten Grund, dass Microsoft die Dinge so schwer zu machen hat. Es ist auf diese Weise gemacht, um es für die Compiler-Autoren nicht die Sprache Benutzer zu erleichtern.

In der Tat ist es nicht guter Grund, warum wir Referenztypen vornehmen müssen und Werte-Typen unterschiedlich verhalten.Microsoft versucht, die logischen Zeiger (Adressen) zu verstecken, aber es funktioniert nicht sehr gut, weil es die Dinge schwieriger nicht einfacher macht. Jede Regel und Einschränkung, die einer Sprache auferlegt wird, erschwert die Dinge und führt zu Ineffektivität, Laufzeitfehlern und höheren Entwicklungskosten.

Wir wären alle besser dran, wenn wir zurück zu den logischen typisierten Zeigern gehen würden. Dann würden wir keine schlauen Worte wie unveränderlich brauchen. (unveränderlich bedeutet unveränderbar!)

Mein Vorschlag ist es, die Nullable-Strukturen abzulegen und sie zu einer Klasse zu machen, die immer nullfähig ist.

Verwandte Themen