Discussion:
Unterschied Property Let vs. Property Set
(zu alt für eine Antwort)
Bernd Heumann
2006-01-17 14:51:30 UTC
Permalink
Hallo NG

Gegeben ist folgender Code.

In einem Klassenmodul (IControl):

dim m_Control as control

public property let IControlL(ctrl as control)
set m_Control=ctrl
end property

public property set IControlS(ctrl as control)
set m_Control=ctrl
end property

Der Aufruf erfolgt dann z.B. in einem Formular:
sub test
dim cI as cls_IControl
set cI= new cls_IControl

'Übergabe via property let
cI.IControlL = me.txtVorname

'Übergabe via Property set
set cI.IControlS = me.txtVorname

end sub

Die Objectübergabe mittels Property Let hab ich bei Stephan Lebans
gefunden. Ich selbst habe bisher immer Property Set verwendet.
Es scheint beides gleichermaßen zu funktionieren, oder gibt es da einen
Unterschied (außer der Syntax;).
Wenn ja, dann wüßte ich natürlich gerne welchen und welche Methode zu
bevorzugen ist.
Wenn nein, wozu dann überhaupt Property Set ...

Grüße
Bernd
Michael Zimmermann
2006-01-17 15:17:51 UTC
Permalink
Hallo!
... Property Let ... Property Set ...
Let nimmst Du bei Wertetypen, Set bei Objekttypen.

Also z. B.

Property Let Wert (NewValue As Long)
m_Wert = NewValue

(klassich Basic: Let m_Wert = NewValue)

neben

Property Get Wert() As Long

aber

Property Set Wert (NewValue As DAO.Database)
Set m_Wert = NewValue

neben

Property Get Wert() As DAO.Database

Gruß aus Mainz
Michael
Bernd Heumann
2006-01-17 15:44:37 UTC
Permalink
Hallo Michael
Post by Michael Zimmermann
Hallo!
... Property Let ... Property Set ...
Let nimmst Du bei Wertetypen, Set bei Objekttypen.
[...]
Post by Michael Zimmermann
Gruß aus Mainz
Michael
Das ist mir schon klar, bzw. so hatte ich das auch gelernt.

Da jedoch:

Public Property Let xy(z as object)
set m_xy=z
end property

scheinbar das gleiche macht wie:

Public Property Set xy(z as object)
set m_xy=z
end property

frage ich mich, wozu überhaupt die Unterscheidung zwischen Property Let
und Set (Bei Property Get gibt es ja auch nur eine Variante).
Oder gibt es ev. doch Unterschiede ( z.B. im Laufzeitverhalten, bei
Initialize/Terminate, bei Verwendung von Variant,
Referencecounter, ...)?

Grüße
Bernd
Michael Zimmermann
2006-01-17 17:41:40 UTC
Permalink
Hallo!
Post by Bernd Heumann
Post by Michael Zimmermann
Let nimmst Du bei Wertetypen, Set bei Objekttypen.
Das ist mir schon klar, bzw. so hatte ich das auch
gelernt.
Ach so.
Post by Bernd Heumann
Public Property Let xy(z as object)
set m_xy=z
end property
Public Property Set xy(z as object)
set m_xy=z
end property
frage ich mich, wozu überhaupt die Unterscheidung
zwischen Property Let und Set (Bei Property Get gibt es
ja auch nur eine Variante).
Oder gibt es ev. doch Unterschiede ( z.B. im
Laufzeitverhalten, bei Initialize/Terminate, bei
Verwendung von Variant,
Referencecounter, ...)?
Beim Testen kommt raus:

Wenn Du Objekte fälschlich mit Property Let statt Get
anlegst, gibt es bei späterer Verwendung im Code mit der
richtigen Syntax

Set ObjektEigenschaft = Objekt

einen Kompilierfehler, während unschönerweise dann

ObjektEigenschaft = Objekt

funktioniert. Du kannst sogar Let und Set parallel anlegen
- also drei Property-Prozeduren für eine Eigenschaft -, dann
gehen beide Syntaxvarianten im Code beliebig.

Diese Toleranz von VBA ist bedauerlich, aber scheinbar
gegeben. Machen würde ich es trotzdem nicht, weil es nicht
im Handbuch steht. Wenn das Verhalten Deiner Objekte mal so,
mal so ist und sich nicht mit der Erwartung, die aufgrund
anderer Objekte besteht, deckt, führt das nur zu heillosem
Kuddelmuddel.

Gruß aus Mainz
Michael
Bernd Heumann
2006-01-17 19:44:48 UTC
Permalink
Hallo Michael
Post by Michael Zimmermann
Hallo!
Post by Bernd Heumann
Post by Michael Zimmermann
Let nimmst Du bei Wertetypen, Set bei Objekttypen.
Das ist mir schon klar, bzw. so hatte ich das auch
gelernt.
Ach so.
Post by Bernd Heumann
Public Property Let xy(z as object)
set m_xy=z
end property
Public Property Set xy(z as object)
set m_xy=z
end property
frage ich mich, wozu überhaupt die Unterscheidung
zwischen Property Let und Set (Bei Property Get gibt es
ja auch nur eine Variante).
Oder gibt es ev. doch Unterschiede ( z.B. im
Laufzeitverhalten, bei Initialize/Terminate, bei
Verwendung von Variant,
Referencecounter, ...)?
Wenn Du Objekte fälschlich mit Property Let statt Get
anlegst, gibt es bei späterer Verwendung im Code mit der
richtigen Syntax
Set ObjektEigenschaft = Objekt
einen Kompilierfehler, während unschönerweise dann
ObjektEigenschaft = Objekt
funktioniert. Du kannst sogar Let und Set parallel anlegen
- also drei Property-Prozeduren für eine Eigenschaft -, dann
gehen beide Syntaxvarianten im Code beliebig.
Diese Toleranz von VBA ist bedauerlich, aber scheinbar
gegeben. Machen würde ich es trotzdem nicht, weil es nicht
im Handbuch steht. Wenn das Verhalten Deiner Objekte mal so,
mal so ist und sich nicht mit der Erwartung, die aufgrund
anderer Objekte besteht, deckt, führt das nur zu heillosem
Kuddelmuddel.
Gruß aus Mainz
Michael
Genau so ein Kuddelmuddel habe ich vorhin mit besagtem Code in Stephan
Lebans Picturebox gehabt.
Der verwendet dort nämlich Property Let anstelle von Set, und ich habe
zunächst verzweifelt gesucht, warum mein Code mit
set Object1.Eigenschaft = Object2
nicht compilieren will:)

Nun hatte ich vermutet, es verbirgt sich da ein tieferer Grund hinter
der Verwendung von LET.
Aber dem ist wohl nicht so.

Grüße
Bernd
Klaus Oberdalhoff
2006-01-18 09:31:52 UTC
Permalink
Hi,
Post by Bernd Heumann
Nun hatte ich vermutet, es verbirgt sich da ein tieferer Grund hinter
der Verwendung von LET.
Aber dem ist wohl nicht so.
wenn mich mein löchriges Gedächtnmis nicht trügt, dann meine ich, mal
irgendwo bei MS gelesen zu haben, dass MS diese Unterscheidung (zwischen Let
und Set, die ich auch nie so ganz kapiert habe, um ehrlich zu sein <g>)
einfügen musste, damit der Compiler mit den Kurzschreibweisen (z.B. .Item
oder .xxx als jeweilige Standardmethode) nicht durcheinanderkommt.

Let selbst im Gegensatz zu Set ist bei Setungen von Wertetypen die
Defaultmethode, daher sollte "VariableXY = 12" und "Let VariableXY = 12"
eigentlich gleichbedeutend sein ...

In .NET gibt es Let nicht mehr, nur noch Set (da alles ein "Object" ist).

Irgend sowas in der Art halt ...
--
mfg

Klaus Oberdalhoff ***@gmx.de

Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99
Bernd Heumann
2006-01-18 10:16:08 UTC
Permalink
Hallo Klaus
Post by Klaus Oberdalhoff
Hi,
Post by Bernd Heumann
Nun hatte ich vermutet, es verbirgt sich da ein tieferer Grund hinter
der Verwendung von LET.
Aber dem ist wohl nicht so.
wenn mich mein löchriges Gedächtnmis nicht trügt, dann meine ich, mal
irgendwo bei MS gelesen zu haben, dass MS diese Unterscheidung
(zwischen Let und Set, die ich auch nie so ganz kapiert habe, um
ehrlich zu sein <g>) einfügen musste, damit der Compiler mit den
Kurzschreibweisen (z.B. .Item oder .xxx als jeweilige Standardmethode)
nicht durcheinanderkommt.
Let selbst im Gegensatz zu Set ist bei Setungen von Wertetypen die
Defaultmethode, daher sollte "VariableXY = 12" und "Let VariableXY =
12" eigentlich gleichbedeutend sein ...
In .NET gibt es Let nicht mehr, nur noch Set (da alles ein "Object" ist).
Irgend sowas in der Art halt ...
Danke für deine Erläuterungen.
Verstehen muß man das ja nicht;)

Grüße
Bernd
Paul Rohorzka
2006-01-18 19:28:39 UTC
Permalink
Hallo Klaus
Post by Klaus Oberdalhoff
wenn mich mein löchriges Gedächtnmis nicht trügt, dann meine ich, mal
irgendwo bei MS gelesen zu haben, dass MS diese Unterscheidung (zwischen
Let und Set, die ich auch nie so ganz kapiert habe, um ehrlich zu sein
<g>) einfügen musste, damit der Compiler mit den Kurzschreibweisen (z.B.
.Item oder .xxx als jeweilige Standardmethode) nicht durcheinanderkommt.
Korrekt. Bei einer Zuweisung

obj1 = obj2

wäre ja ohne den Let/Set-Unterschied nicht klar, ob die /Referenzen/
oder die /Standardwerte/ kopiert werden sollen.

Zur Illustration können wir in einem Formular mit zwei Textfeldern
[txtA] und [txtB] ein kleines Experiment starten:

<Code Where="Access.Form">
Dim txt As Access.TextBox

' Test mit Let
Debug.Print "--- Test ohne Set ---"
Me.txtA.Value = "Text A"
Me.txtB.Value = "Text B"

Set txt = Me.txtA ' txt ist eine Referenz auf Me.txtA
Debug.Print "A: " & Me.txtA.Value, _
"B: " & Me.txtB.Value, _
"txt: " & txt.Value

txt = Me.txtB ' *** Kein Set!
' Eigentlich: txt.Value = Me.txtB.Value
' Me.txtA übernimmt den Wert von Me.txtB
Debug.Print "A: " & Me.txtA.Value, _
"B: " & Me.txtB.Value, _
"txt: " & txt.Value

txt.Value = "Neuer Text" ' Der Wert von txt (und damit Me.txtA)
' wird geändert
Debug.Print "A: " & Me.txtA.Value, _
"B: " & Me.txtB.Value, _
"txt: " & txt.Value
</Code>

Ausgabe dieses Codes:
--- Test ohne Set ---
A: Text A B: Text B txt: Text A
A: Text B B: Text B txt: Text B
A: Neuer Text B: Text B txt: Neuer Text


Nun verwenden wir in der mit *** markierten Zeile ein Set:

<Code Where="Access.Form">
' Test mit Set
Debug.Print "--- Test mit Set ---"
Me.txtA.Value = "Text A"
Me.txtB.Value = "Text B"

Set txt = Me.txtA ' txt ist eine Referenz auf Me.txtA
Debug.Print "A: " & Me.txtA.Value, _
"B: " & Me.txtB.Value, _
"txt: " & txt.Value

Set txt = Me.txtB ' *** Set!
' txt ist eine Referenz auf Me.txtB
Debug.Print "A: " & Me.txtA.Value, _
"B: " & Me.txtB.Value, _
"txt: " & txt.Value

txt.Value = "Neuer Text" ' Der Wert von txt (und damit Me.txtB)
' wird geändert
Debug.Print "A: " & Me.txtA.Value, _
"B: " & Me.txtB.Value, _
"txt: " & txt.Value
</Code>

Ausgabe dieses Codes:
--- Test mit Set ---
A: Text A B: Text B txt: Text A
A: Text A B: Text B txt: Text B
A: Text A B: Neuer Text txt: Neuer Text
Post by Klaus Oberdalhoff
Let selbst im Gegensatz zu Set ist bei Setungen von Wertetypen die
Defaultmethode, daher sollte "VariableXY = 12" und "Let VariableXY = 12"
eigentlich gleichbedeutend sein ...
Isses auch.
Post by Klaus Oberdalhoff
In .NET gibt es Let nicht mehr, nur noch Set (da alles ein "Object" ist).
Naja, in diesem Zusammenhang könnte man fast eher sagen, dass alles ein
Speicherplatz ist, der kopiert wird. Im Fall von Referenztypen ist das
eben diese Referenz, im Fall von Werttypen die eigentlichen Nutzdaten.

Wie du richtig geschrieben hast, ist einfach nur die Unterscheidung
zwischen Referenz und Wert der Standardeigenschaft hinfällig, weil es
keine nicht indizierten Standardeigenschaften mehr gibt. Hingegen lässt
sich immer noch bei einer Auflistung oder ähnlichen Typen eine
parametrisierte Eigenschaft als Default kennzeichnen. Damit ist es nach
wie vor möglich, auf Elemente einer Auflistung zuzugreifen, ohne ein
Item (oder Äquivalentes) zu schreiben:

obj = coll.Item(123)
ist damit gleichwertig mit
obj = coll(123)
wenn Item die Standardeigenschaft des Typs von coll ist.
Post by Klaus Oberdalhoff
Irgend sowas in der Art halt ...
Genau. ;-)


LG aus Wien,
Paul
--
http://www.softconcept.at - Development, Solutions, Tools
http://access.primary.at - Wiener Access-Stammtisch
Bernd Heumann
2006-01-18 20:36:34 UTC
Permalink
Hallo Paul
Post by Bernd Heumann
Hallo Klaus
Post by Klaus Oberdalhoff
wenn mich mein löchriges Gedächtnmis nicht trügt, dann meine ich, mal
irgendwo bei MS gelesen zu haben, dass MS diese Unterscheidung
(zwischen Let und Set, die ich auch nie so ganz kapiert habe, um
ehrlich zu sein <g>) einfügen musste, damit der Compiler mit den
Kurzschreibweisen (z.B. .Item oder .xxx als jeweilige
Standardmethode) nicht durcheinanderkommt.
Korrekt. Bei einer Zuweisung
obj1 = obj2
wäre ja ohne den Let/Set-Unterschied nicht klar, ob die /Referenzen/
oder die /Standardwerte/ kopiert werden sollen.
[...]
Post by Bernd Heumann
LG aus Wien,
Paul
Jappa
So langsam erkenne ich ein Muster;)

Grüße
Bernd
Paul Rohorzka
2006-01-18 20:51:16 UTC
Permalink
Hi Bernd!
Post by Bernd Heumann
Post by Paul Rohorzka
[...]
Korrekt. Bei einer Zuweisung
obj1 = obj2
wäre ja ohne den Let/Set-Unterschied nicht klar, ob die /Referenzen/
oder die /Standardwerte/ kopiert werden sollen.
[...]
Post by Paul Rohorzka
LG aus Wien,
Paul
Jappa
So langsam erkenne ich ein Muster;)
Bin ich vorhersehbar? ;-)

Ciao,
Paul
--
http://www.softconcept.at - Development, Solutions, Tools
http://access.primary.at - Wiener Access-Stammtisch
Klaus Oberdalhoff
2006-01-18 21:54:42 UTC
Permalink
Hi Paul,

Danke; hat mich gehelft zu ferstehen ;-)))
--
mfg

Klaus Oberdalhoff ***@gmx.de

Ich beantworte keine NG-Fragen und -Nachfragen per Mail!
Newbie-Info: http://www.doerbandt.de/Access/Newbie.htm
KnowHow-mdb: http://www.freeaccess.de
Sofern Access 200x bitte beachten:
http://www.freeaccess.de/MS-Access-Artikel.asp?ID=99
Loading...