none
Was ist der Unterschied zwischen Private und Private shared? RRS feed

  • 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
    Donnerstag, 30. September 2010 08:02

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
    Donnerstag, 30. September 2010 08:37
    Moderator
  • hallo Ellen,

    Siehe


       http://msdn.microsoft.com/en-us/library/7ee5a7s1%28v=VS.71%29.aspx

     

    Wenn 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
    Donnerstag, 30. September 2010 08:40
  • 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 Boolean

        Private Sub Form1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Click

            Console.WriteLine("_________________")
            Toggle = Not Toggle
            If Toggle Then
                CT1.Text = "Hallo"
                CT1.TextShared = "Hallo Welt"
            Else
                CT1.Text = ""
                CT1.TextShared = ""
            End If

            Console.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.Load

            CT1 = New clsTest
            CT2 = New clsTest
            CT2.Text = "Original"
            CT2.TextShared = "OriginalShared"

        End Sub

        Private Sub CT1_TextChanged _
                (ByVal TextNew As String _
                ) Handles CT1.TextChanged

            Console.WriteLine _
                    ("CT1_TextChanged: " & TextNew)
        End Sub

        Private Sub CT1_TextSharedChanged _
                (ByVal TextNew As String _
                ) Handles CT1.TextSharedChanged

            Console.WriteLine _
                    ("CT1_TextSharedChanged: " & TextNew)
        End Sub
    End Class
    ' \ \ \  Ende Code Form1.vb

    ' / / / Code in Klassenmodul clsTest.vb
    Public Class clsTest

        Private Shared mTextShared As String
        Private mText As String

        Public 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 Property

        Public 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.vb

    Nach 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
    Donnerstag, 30. September 2010 11:36

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
    Donnerstag, 30. September 2010 08:37
    Moderator
  • hallo Ellen,

    Siehe


       http://msdn.microsoft.com/en-us/library/7ee5a7s1%28v=VS.71%29.aspx

     

    Wenn 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
    Donnerstag, 30. September 2010 08:40
  •  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
    Donnerstag, 30. September 2010 10:53
  • 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 Boolean

        Private Sub Form1_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Click

            Console.WriteLine("_________________")
            Toggle = Not Toggle
            If Toggle Then
                CT1.Text = "Hallo"
                CT1.TextShared = "Hallo Welt"
            Else
                CT1.Text = ""
                CT1.TextShared = ""
            End If

            Console.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.Load

            CT1 = New clsTest
            CT2 = New clsTest
            CT2.Text = "Original"
            CT2.TextShared = "OriginalShared"

        End Sub

        Private Sub CT1_TextChanged _
                (ByVal TextNew As String _
                ) Handles CT1.TextChanged

            Console.WriteLine _
                    ("CT1_TextChanged: " & TextNew)
        End Sub

        Private Sub CT1_TextSharedChanged _
                (ByVal TextNew As String _
                ) Handles CT1.TextSharedChanged

            Console.WriteLine _
                    ("CT1_TextSharedChanged: " & TextNew)
        End Sub
    End Class
    ' \ \ \  Ende Code Form1.vb

    ' / / / Code in Klassenmodul clsTest.vb
    Public Class clsTest

        Private Shared mTextShared As String
        Private mText As String

        Public 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 Property

        Public 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.vb

    Nach 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
    Donnerstag, 30. September 2010 11:36
  • 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
    Freitag, 8. Oktober 2010 10:13
  • hallo Ellen,

    die Frage hast du dir eigentlich schon selbst beantwortet: Der Compiler hat dies beim Erstellen der DLL schon alles erledigt.

    Für dich ist es hinreichend, diese Klasse einfach zu benutzen.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    Freitag, 8. Oktober 2010 10:24
  • Hallo Stefan,

    Dein Beispiel gehört in ein Lehrbuch. das ist richtig gut.

    Danke nochmals Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Freitag, 8. Oktober 2010 10:50