Benutzer mit den meisten Antworten
Was ist der Unterschied zwischen Private und Private shared?

Frage
-
Hallo zusammen,
in einem aktuellen thread von mir ist dieses Thema hochgekommen. Kann mir jemand von Euch das in einfachen Worten erklären?
Vielen Dank und schöne Grüße Ellen
Public class A Private x as integer Private shared y as integer end class
Ich benutze/ I'm using VB2008 & VB2010
Antworten
-
Hallo Ellen,
in einem aktuellen thread von mir ist dieses Thema hochgekommen. Kann mir jemand von Euch das in einfachen Worten erklären?
eigentlich ist das in der Dokumentation schon recht gut erklärt:
Shared (Visual Basic)
http://msdn.microsoft.com/de-de/library/zc2b427x.aspx
"Durch die Freigabe eines Klassen- oder Strukturmembers wird dieser allen Instanzen verfügbar gemacht, sodass die einzelnen Instanzen im Gegensatz zu nicht freigegebenen Membern nicht über eine eigene Kopie verfügen."
Member die mit Shared deklariert sind, sind also nicht an eine einzelne Instanz gebunden, sondern existieren anwendungsweit genau ein einziges mal. Lässt man Shared weg, gilt der Member für jede einzelne Instanz. Erstellst Du 10 Instanzen Deiner Klasse, die bspw. eine Instanzvariable enthält, erhält jede Instanz einen voneinander unabhängigen Speicherbereich dieser Variablen. Bei Shared existiert nur ein einziger.
Die Verwendung von Shared ist vergleichbar mit der Verwendung von Modulen. Diese stehen ebenfalls anwendungsweit zur Verfügung und werden intern ebenfalls mit Shared implementiert. Aus Sicht der Objektorientierung sollte jedoch auf die Verwendung von Modulen verzichtet werden.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 30. September 2010 10:05
- Als Antwort markiert Ellen Ramcke Donnerstag, 30. September 2010 10:54
-
hallo Ellen,
Siehe
http://msdn.microsoft.com/en-us/library/7ee5a7s1%28v=VS.71%29.aspxWenn eine Variable als Private Shared deklariert ist, kannst du auf sie zugreifen, ohne eine Instanz der Klasse erstellen zu müssen. Alle Instanzen teilen sich diesen Wert.
Imports System.Text <TestClass()> Public Class UnitTest1 <TestMethod()> Public Sub TestMethod1() Dim clsA1 As New A() Dim clsA2 As New A() A.x = 321 clsA1.SetY(123) Assert.AreEqual(clsA2.GetX, 321, "not equal") Assert.AreEqual(clsA2.GetY, 123, "not equal") End Sub End Class Public Class A Public Shared x As Integer Private Shared y As Integer Public Function GetX() As Integer GetX = x End Function Public Sub SetY(ByVal AValue As Integer) A.y = AValue End Sub Public Function GetY() As Integer GetY = y End Function End Class
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 30. September 2010 10:05
- Als Antwort markiert Ellen Ramcke Donnerstag, 30. September 2010 10:54
-
Hallo Ellen,
in einem aktuellen thread von mir ist dieses Thema hochgekommen.
Kann mir jemand von Euch das in einfachen Worten erklären?In nachfolgenden Beispiel kannst Du den Unterschied zwischen
Deklarationen mit und ohne Shared schon beobachten.' / / / Code in einem leeren Formmodul Form1
Public Class Form1
Private WithEvents CT1 As clsTest
Private WithEvents CT2 As clsTest
Private Toggle As BooleanPrivate Sub Form1_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.ClickConsole.WriteLine("_________________")
Toggle = Not Toggle
If Toggle Then
CT1.Text = "Hallo"
CT1.TextShared = "Hallo Welt"
Else
CT1.Text = ""
CT1.TextShared = ""
End IfConsole.WriteLine _
("CT2.Text: " & CT2.Text)Console.WriteLine _
("CT2.TextShared: " & CT2.TextShared)End Sub
Private Sub Form1_Load _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.LoadCT1 = New clsTest
CT2 = New clsTest
CT2.Text = "Original"
CT2.TextShared = "OriginalShared"End Sub
Private Sub CT1_TextChanged _
(ByVal TextNew As String _
) Handles CT1.TextChangedConsole.WriteLine _
("CT1_TextChanged: " & TextNew)
End SubPrivate Sub CT1_TextSharedChanged _
(ByVal TextNew As String _
) Handles CT1.TextSharedChangedConsole.WriteLine _
("CT1_TextSharedChanged: " & TextNew)
End Sub
End Class
' \ \ \ Ende Code Form1.vb' / / / Code in Klassenmodul clsTest.vb
Public Class clsTestPrivate Shared mTextShared As String
Private mText As StringPublic Event TextSharedChanged(ByVal TextNew As String)
Public Event TextChanged(ByVal TextNew As String)Public Property TextShared() As String
Get
Return mTextShared
End Get
Set(ByVal value As String)
mTextShared = value
RaiseEvent TextSharedChanged(mTextShared)
End Set
End PropertyPublic Property Text() As String
Get
Return mText
End Get
Set(ByVal value As String)
mText = value
RaiseEvent TextChanged(mText)
End Set
End Property
End Class
' \ \ \ Ende Code clsTest.vbNach dem Programmstart auf die Form klicken und im
Ausgabefenster die Ergebnisse beobachten und wieder
auf die Form klicken und .... usw.Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Ellen Ramcke Donnerstag, 30. September 2010 12:07
Alle Antworten
-
Hallo Ellen,
in einem aktuellen thread von mir ist dieses Thema hochgekommen. Kann mir jemand von Euch das in einfachen Worten erklären?
eigentlich ist das in der Dokumentation schon recht gut erklärt:
Shared (Visual Basic)
http://msdn.microsoft.com/de-de/library/zc2b427x.aspx
"Durch die Freigabe eines Klassen- oder Strukturmembers wird dieser allen Instanzen verfügbar gemacht, sodass die einzelnen Instanzen im Gegensatz zu nicht freigegebenen Membern nicht über eine eigene Kopie verfügen."
Member die mit Shared deklariert sind, sind also nicht an eine einzelne Instanz gebunden, sondern existieren anwendungsweit genau ein einziges mal. Lässt man Shared weg, gilt der Member für jede einzelne Instanz. Erstellst Du 10 Instanzen Deiner Klasse, die bspw. eine Instanzvariable enthält, erhält jede Instanz einen voneinander unabhängigen Speicherbereich dieser Variablen. Bei Shared existiert nur ein einziger.
Die Verwendung von Shared ist vergleichbar mit der Verwendung von Modulen. Diese stehen ebenfalls anwendungsweit zur Verfügung und werden intern ebenfalls mit Shared implementiert. Aus Sicht der Objektorientierung sollte jedoch auf die Verwendung von Modulen verzichtet werden.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 30. September 2010 10:05
- Als Antwort markiert Ellen Ramcke Donnerstag, 30. September 2010 10:54
-
hallo Ellen,
Siehe
http://msdn.microsoft.com/en-us/library/7ee5a7s1%28v=VS.71%29.aspxWenn eine Variable als Private Shared deklariert ist, kannst du auf sie zugreifen, ohne eine Instanz der Klasse erstellen zu müssen. Alle Instanzen teilen sich diesen Wert.
Imports System.Text <TestClass()> Public Class UnitTest1 <TestMethod()> Public Sub TestMethod1() Dim clsA1 As New A() Dim clsA2 As New A() A.x = 321 clsA1.SetY(123) Assert.AreEqual(clsA2.GetX, 321, "not equal") Assert.AreEqual(clsA2.GetY, 123, "not equal") End Sub End Class Public Class A Public Shared x As Integer Private Shared y As Integer Public Function GetX() As Integer GetX = x End Function Public Sub SetY(ByVal AValue As Integer) A.y = AValue End Sub Public Function GetY() As Integer GetY = y End Function End Class
Microsoft MVP Office Access
https://mvp.support.microsoft.com/profile/Stefan.Hoffmann- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 30. September 2010 10:05
- Als Antwort markiert Ellen Ramcke Donnerstag, 30. September 2010 10:54
-
Erstellst Du 10 Instanzen Deiner Klasse, die bspw. eine Instanzvariable enthält, erhält jede Instanz einen voneinander unabhängigen Speicherbereich dieser Variablen. Bei Shared existiert nur ein einziger.
Hallo Thorsten, das war der entscheidende Hinweis. Verstanden! Hatte einfach aus den Augen verloren, dass man ja auch mehrere Instanzen erzeugen kann. Stefan auch Dank für Deine Ausführungen.
schöne Grüße Ellen
Ich benutze/ I'm using VB2008 & VB2010 -
Hallo Ellen,
in einem aktuellen thread von mir ist dieses Thema hochgekommen.
Kann mir jemand von Euch das in einfachen Worten erklären?In nachfolgenden Beispiel kannst Du den Unterschied zwischen
Deklarationen mit und ohne Shared schon beobachten.' / / / Code in einem leeren Formmodul Form1
Public Class Form1
Private WithEvents CT1 As clsTest
Private WithEvents CT2 As clsTest
Private Toggle As BooleanPrivate Sub Form1_Click _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.ClickConsole.WriteLine("_________________")
Toggle = Not Toggle
If Toggle Then
CT1.Text = "Hallo"
CT1.TextShared = "Hallo Welt"
Else
CT1.Text = ""
CT1.TextShared = ""
End IfConsole.WriteLine _
("CT2.Text: " & CT2.Text)Console.WriteLine _
("CT2.TextShared: " & CT2.TextShared)End Sub
Private Sub Form1_Load _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.LoadCT1 = New clsTest
CT2 = New clsTest
CT2.Text = "Original"
CT2.TextShared = "OriginalShared"End Sub
Private Sub CT1_TextChanged _
(ByVal TextNew As String _
) Handles CT1.TextChangedConsole.WriteLine _
("CT1_TextChanged: " & TextNew)
End SubPrivate Sub CT1_TextSharedChanged _
(ByVal TextNew As String _
) Handles CT1.TextSharedChangedConsole.WriteLine _
("CT1_TextSharedChanged: " & TextNew)
End Sub
End Class
' \ \ \ Ende Code Form1.vb' / / / Code in Klassenmodul clsTest.vb
Public Class clsTestPrivate Shared mTextShared As String
Private mText As StringPublic Event TextSharedChanged(ByVal TextNew As String)
Public Event TextChanged(ByVal TextNew As String)Public Property TextShared() As String
Get
Return mTextShared
End Get
Set(ByVal value As String)
mTextShared = value
RaiseEvent TextSharedChanged(mTextShared)
End Set
End PropertyPublic Property Text() As String
Get
Return mText
End Get
Set(ByVal value As String)
mText = value
RaiseEvent TextChanged(mText)
End Set
End Property
End Class
' \ \ \ Ende Code clsTest.vbNach dem Programmstart auf die Form klicken und im
Ausgabefenster die Ergebnisse beobachten und wieder
auf die Form klicken und .... usw.Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)- Als Antwort markiert Ellen Ramcke Donnerstag, 30. September 2010 12:07
-
Hallo Stefan,
ach soo. Der Compiler erkennt "shared" und legt eine Variable entsprechend an, ohne das class A instanziert wird. Aber was ist, wenn Class A nicht als Sourcecode sondern als DLL vorliegt. Wie erkennt denn der Compiler das gekapselte Private shared?
schöne Grüße Ellen
P.S. Hat sich erledigt. Hab nur nicht richtig geguckt. Y ist public und kann von aussen ohne Instanz beschrieben werden. x ist private für beide Instanzen von Class A. Diese teilen sich x
so und zum Code von Peter...
(Ein sehr gutes Beispiel, läuft ..)
Ich benutze/ I'm using VB2008 & VB2010- Bearbeitet Ellen Ramcke Freitag, 8. Oktober 2010 10:41 erledigt
-