Wie ByRef-Ubergabe eines nicht veraenderbaren Arguments bemerken?

25/06/2009 - 20:34 von Christoph Schneegans | Report spam
Hallo allerseits!

<http://msdn.microsoft.com/en-us/lib...h.aspx> erklàrt ja
sehr schön den Unterschied zwischen verànderbaren und nicht
verànderbaren Argumenten. Ich finde es trotzdem merkwürdig, daß ich
für

Sub SetByRef(ByRef i As Integer)
i = 2
End Sub

Sub Main(ByVal args As String())
SetByRef(1)
End Sub

keine Compiler-Warnung erhalte. Kann man Visual Studio 2005 da
irgendwie auf die Sprünge helfen? Aktuell erwàge ich, eine
schreibgeschützte Eigenschaft

ReadOnly Property ReadonlyProperty() As Integer
Get
Return 1
End Get
End Property

nur deshalb beschreibar zu machen, damit ich wenigstens zur Laufzeit
eine versuchte Zuweisung sicher bemerke, etwa so:

Module Main

Sub SetByRef(ByRef i As Integer)
i = 2
End Sub

Property ReadonlyProperty() As Integer
Get
Return 1
End Get
Set(ByVal value As Integer)
Throw New InvalidOperationException
End Set
End Property

Sub Main(ByVal args As String())
SetByRef(ReadonlyProperty)
End Sub

End Module

Gibt es elegantere Methoden?

<http://schneegans.de/web/kanonische-adressen/> · Gute URLs
 

Lesen sie die antworten

#1 Martin H.
25/06/2009 - 22:40 | Warnen spam
Hallo Christoph,

für

Sub SetByRef(ByRef i As Integer)
i = 2
End Sub

Sub Main(ByVal args As String())
SetByRef(1)
End Sub

keine Compiler-Warnung erhalte. Kann man Visual Studio 2005 da
irgendwie auf die Sprünge helfen? Aktuell erwàge ich, eine
schreibgeschützte Eigenschaft



Ich denke, dass das ein Definitionsproblem ist.
s. http://msdn.microsoft.com/de-de/lib...k1z30.aspx

http://msdn.microsoft.com/de-de/lib...w3zkh.aspx

Zitat:
"Einem nicht verànderbaren Argument liegt entweder ein nicht
verànderbares Element zugrunde, oder es wird mit ByVal übergeben. Die
Prozedur kann das zugrunde liegende Element im Aufrufcode nicht àndern,
auch wenn es sich um ein verànderbares Element handelt. Wenn es sich um
ein nicht verànderbares Element handelt, kann es vom Aufrufcode selbst
nicht geàndert werden.

Die aufgerufene Prozedur àndert gegebenenfalls die Kopie eines nicht
verànderbaren Arguments; die Änderung hat jedoch keinen Einfluss auf das
im Aufrufcode zugrunde liegende Element."

Das von Dir beschriebene Verhalten ist also kein Fehler, sondern "by
Design". Dieses Verhalten war übrigens schon in Classic-VB so (habe ich
mit VB 5 überprüft). Aber ich stimme Dir zu: Von der Logik her sollte
das eigentlich nicht so sein.

Zu Deinem Code:

Sub SetByRef(ByRef i As Integer)
i = 2
End Sub

Property ReadonlyProperty() As Integer
Get
Return 1
End Get
Set(ByVal value As Integer)
Throw New InvalidOperationException
End Set
End Property

Sub Main(ByVal args As String())
SetByRef(ReadonlyProperty)
End Sub



Ich sehe hier ehrlich gesagt den Sinn nicht.
Wenn Du den Set-Teil wegnimmst ist das Property ReadOnly,
Es kann also keine Zuweisung erhalten. Aber was hindert Dich,
bei SetByRef einfach eine Konstante zu übergeben? Das eine schließt doch
das andere nicht aus...Dann weißt Du also immer noch nicht, ob Variable
der aufrufenden Prozedur wirklich veràndert werden kann.

Beste Grüße,

Martin

Ähnliche fragen