none
Verständnisfrage zur DOT Schreibweise in Visual Basic RRS feed

  • Frage

  • Dim buffer() As Byte = Encoding.Default.GetBytes("Hallo Welt".ToUpper)
    

    Hallo zusammen,

    was dieser Code macht, ist mir schon klar. Was ich hier nicht verstehe, dass hier 2 member der Encoding Klasse aufgerufen werden. Ich verstehe nicht den "Automatismus" der sich Zwischen .Default und .Getbytes abspielt. Zumal wir auch kein Sourcecode haben.

    laut msdn Beschreibung:

    'Deklaration
    
    Public Overridable Function GetBytes ( _
    	s As String _
    ) As Byte()
    
    'Encoding.Default-Eigenschaft 
    
    'Deklaration
    
    Public Shared ReadOnly Property Default As Encoding
    	Get
    

     Also .Default gibt Werte zurück. Aber wie wird der Rückgabewert von .Getbytes hier verarbeitet. Das sehe ich nicht.

    schöne Grüße Ellen

     


    Ich benutze/ I'm using VB2008 & VB2010
    Dienstag, 30. November 2010 11:21

Antworten

  • Hallo Ellen

    wenn du es mal auf zwei Zeilen aufbrichst:

      Dim enc As Encoding = Encoding.Default
      Dim buffer() As Byte = enc.GetBytes("Hallo Welt")

    was verstehst du dann noch nicht?

    • Als Antwort markiert Ellen Ramcke Donnerstag, 2. Dezember 2010 12:14
    Dienstag, 30. November 2010 11:29
  • Encoding.Default verstehe ich trotzdem noch nicht. .Default ist ein property und hat lediglich einen getter. Gibt also etwas zurück und nimmt nichts entgegen.

    Ellen,
    vom C# original als VB umgeschriebener Getter, grob:

    Public Shared ReadOnly Property Default As Encoding
     Get
     If defaultEncoding Is Nothing Then
      defaultEncoding = CreateDefaultEncoding()
     End If
     return defaultEncoding
     End Get
    End Property
    
    


    Das Ziel ist bei diesem Setter inbesondere bei Performance/Resourcen-sparen, so dass die interne Variable 'defaultEncoding' nur einmal (erstmaligen Aufruf) zu initialisieren ist.
    Und jene interne CreateDefaultEncoding() Methode kannst du dir vereinfacht vorstellen wie ein Aufruf von
    Encoding.GetEncoding-Methode (codepage)
    http://msdn.microsoft.com/de-de/library/wzsz3bk3.aspx

    mit aktueller System-Ansi-Codepage.
    Und somit könnte man anstelle von genannter Zeile:
       Dim enc As Encoding = Encoding.Default
    für  'unsere Kultur' auch 'hard-codiert' schreiben:
       Dim enc As Encoding = Encoding.GetEncoding(1252)

    Der Rest ist pure VB-Grundlage zu Eigenschaften und Klassen-Instanzen.
    Aber ich vermute anhand deiner Formulierung, dass du am falschen Ende suchst. Ich rate zu intensivem Studium der Bücher/Doku/Bsp, denn ohne dieses Wissen kommt man nicht weit, beginne mit zB:
    Eigenschaften
    http://msdn.microsoft.com/de-de/library/aa711977(VS.71).aspx
    letzter Abschnitt
     "Mit Hilfe von Eigenschaften kann die Initialisierung einer Ressource so lange verzögert werden"

    • Als Antwort markiert Ellen Ramcke Donnerstag, 2. Dezember 2010 12:15
    Mittwoch, 1. Dezember 2010 12:14
  • hallo Ellen,

    eine Property kann jeden Type haben, d.h. auch Klassen und damit im Besonderen auch die eigene Klasse.

    Encoding.Default ist eine statische Property. D.h. du kannst sie nutzen ohne eine Instanz von Encoding erzeugen zu müssen. Sie liefert dir eine Encoding-Instanz mit Standardwerten. Tippe einfach mal Encoding.Default ein und drücke F12 wenn der Cursor auf Default steht, dann zeigt VS dir die Definition:

    Public Shared ReadOnly Property [Default] As System.Text.Encoding
         Member of System.Text.Encoding

    Es wird also der statische Getter für die Eigenschaft Default aufgerufen.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    • Als Antwort markiert Ellen Ramcke Donnerstag, 2. Dezember 2010 12:15
    Donnerstag, 2. Dezember 2010 11:24

Alle Antworten

  • Hallo Ellen

    wenn du es mal auf zwei Zeilen aufbrichst:

      Dim enc As Encoding = Encoding.Default
      Dim buffer() As Byte = enc.GetBytes("Hallo Welt")

    was verstehst du dann noch nicht?

    • Als Antwort markiert Ellen Ramcke Donnerstag, 2. Dezember 2010 12:14
    Dienstag, 30. November 2010 11:29
  • Ich verstehe nicht den "Automatismus" der sich Zwischen .Default und .Getbytes abspielt. Zumal wir auch kein Sourcecode haben.
    Ellen, dazu noch

    der 'Original' C# Source Code zu Encoding (und vielen BCL-Klassen) ist von Microsoft verfügbar im:
    Microsoft Reference Source Code Center
    http://referencesource.microsoft.com/netframework.aspx

    Dienstag, 30. November 2010 11:45
  • Hallo Ellen,

    Encoding.Default liefert die ANSI Code page des Systems zurück,
    was in Deutschland üblicherweise Windows 1252 ist.

    Mit Hilfe der dort enhaltenen Informationen wandelt GetBytes die Zeichenkette,
    die in .NET immer Unicode ist (siehe Unicode in .NET Framework ) in ein Byte-Array um.
    Ein Byte-Array ist dabei die universellste Darstellungsform, die man in Dateien ablegen,
    übers Netzwerk versenden kann usw.
    Nur muß man jeweils auch wissen um, was für Bytes es sich dabei handelt,
    denn die Information, welcher Zeichensatz (Encoding) es ist, geht dabei verloren.

    Dieses Byte-Array kannst Du über in einen Stream lesen (Read ) und schreiben (Write ).
    Um daraus später wieder eine Zeichenfolge zu machen, würde man Encoding.GetString verwenden.
    Da ANSI Zeichensätze nur einen Vorrat von 256 Zeichen haben, kann es auch zu Verlusten kommen.

    Praktisch tut man das selten, da Klassen wie StreamReader und StreamWriter
    die Funktionalität bereits eingebaut haben. Dort übergibt man das Encoding
    und der Rest findet automatisch statt.

    Gruß Elmar

    Dienstag, 30. November 2010 15:00
    Beantworter
  • wenn du es mal auf zwei Zeilen aufbrichst:

      Dim enc As Encoding = Encoding.Default
      Dim buffer() As Byte = enc.GetBytes("Hallo Welt")



    Hallo Thomas und Elmar,

    so sieht die Sache schon etwas anders aus. Die zweite Zeile stellt für mich kein Problem mehr dar. Encoding.Default verstehe ich trotzdem noch nicht. .Default ist ein property und hat lediglich einen getter. Gibt also etwas zurück und nimmt nichts entgegen. Außerdem wird durch diese Anweisung kein Stückchen Code ausgeführt. Also.. ich muss doch beim Encoding definitiv vorgeben, was zu tun ist. Das würde einen setter erfordern oder eine Methode wie z.B encoding(DEFAULT)

    schöne Grüße Ellen


    Ich benutze/ I'm using VB2008 & VB2010
    Mittwoch, 1. Dezember 2010 11:28
  • Encoding.Default verstehe ich trotzdem noch nicht. .Default ist ein property und hat lediglich einen getter. Gibt also etwas zurück und nimmt nichts entgegen.

    Ellen,
    vom C# original als VB umgeschriebener Getter, grob:

    Public Shared ReadOnly Property Default As Encoding
     Get
     If defaultEncoding Is Nothing Then
      defaultEncoding = CreateDefaultEncoding()
     End If
     return defaultEncoding
     End Get
    End Property
    
    


    Das Ziel ist bei diesem Setter inbesondere bei Performance/Resourcen-sparen, so dass die interne Variable 'defaultEncoding' nur einmal (erstmaligen Aufruf) zu initialisieren ist.
    Und jene interne CreateDefaultEncoding() Methode kannst du dir vereinfacht vorstellen wie ein Aufruf von
    Encoding.GetEncoding-Methode (codepage)
    http://msdn.microsoft.com/de-de/library/wzsz3bk3.aspx

    mit aktueller System-Ansi-Codepage.
    Und somit könnte man anstelle von genannter Zeile:
       Dim enc As Encoding = Encoding.Default
    für  'unsere Kultur' auch 'hard-codiert' schreiben:
       Dim enc As Encoding = Encoding.GetEncoding(1252)

    Der Rest ist pure VB-Grundlage zu Eigenschaften und Klassen-Instanzen.
    Aber ich vermute anhand deiner Formulierung, dass du am falschen Ende suchst. Ich rate zu intensivem Studium der Bücher/Doku/Bsp, denn ohne dieses Wissen kommt man nicht weit, beginne mit zB:
    Eigenschaften
    http://msdn.microsoft.com/de-de/library/aa711977(VS.71).aspx
    letzter Abschnitt
     "Mit Hilfe von Eigenschaften kann die Initialisierung einer Ressource so lange verzögert werden"

    • Als Antwort markiert Ellen Ramcke Donnerstag, 2. Dezember 2010 12:15
    Mittwoch, 1. Dezember 2010 12:14
  • Hallo Thomas, dieser Script beschäftigt mich schon sehr und ich muss Dir leider sagen, daß das Thema für mich noch nicht vom Tisch ist. Wie ich mit properties arbeite, ist mir geläufig. Auch die Tatsache, daß ich darin Code einbauen kann. Dieser Code wird ausgeführt, wenn ich den Get- oder Set Accessor aufrufe. OK. Jetzt wieder zu unserer kleinen Zeile: Dim enc as Encoding = Encoding.Default Ich kann nicht erkennen, dass hier der Get accassor von .Default aufgerufen wird. Also wird auch kein Code ausgeführt. Oder doch? Dann ist mir aufgefallen, dass dieses property den Typ der eigenen Klasse hat. Hängt das damit vielleicht zusammen. schöne Grüße Ellen
    Ich benutze/ I'm using VB2008 & VB2010
    • Bearbeitet Ellen Ramcke Donnerstag, 2. Dezember 2010 12:10 Korrektur
    Donnerstag, 2. Dezember 2010 11:12
  • hallo Ellen,

    eine Property kann jeden Type haben, d.h. auch Klassen und damit im Besonderen auch die eigene Klasse.

    Encoding.Default ist eine statische Property. D.h. du kannst sie nutzen ohne eine Instanz von Encoding erzeugen zu müssen. Sie liefert dir eine Encoding-Instanz mit Standardwerten. Tippe einfach mal Encoding.Default ein und drücke F12 wenn der Cursor auf Default steht, dann zeigt VS dir die Definition:

    Public Shared ReadOnly Property [Default] As System.Text.Encoding
         Member of System.Text.Encoding

    Es wird also der statische Getter für die Eigenschaft Default aufgerufen.


    Microsoft MVP Office Access
    https://mvp.support.microsoft.com/profile/Stefan.Hoffmann
    • Als Antwort markiert Ellen Ramcke Donnerstag, 2. Dezember 2010 12:15
    Donnerstag, 2. Dezember 2010 11:24
  • Hallo Thomas und Stefan,

    in dem Moment wo ich den Sende button für meine Anwort betätigt habe, ist mir der "der Groschen gefallen". Manchmal sieht man einfach den Wald nicht mehr vor lauter Bäumen. (Zeichen mal eine Pause zu machen)  Die Zeile Dim enq As Encoding = Encoding.Default ruft den Get Acessor auf. Natürlich!! Damit wird ein encoder initialisert, wie Thomas schon gesagt hat. Mit enq werden dann auch die anderen Methoden dieser Klasse erzeugt, wie GetBytes...   Alles klar.

    Na Gut. In der msdn Doku werden nur die Definitionen angezeigt. Das sollte idR auch genügen. Der Code, welcher dahinter steht kann alles mögliche sein und ist für den Anwender dieser Klassen eigentlich eine Black Box.  Ich persönlich möchte auch in diesen Quellcode nicht einstiegen. Zum Verständniss ist es jedoch manchmal vorteilhaft.

    Ich bedanke mich für Eure Hilfe

    schöne Grüße Ellen

     

     

     


    Ich benutze/ I'm using VB2008 & VB2010
    • Bearbeitet Ellen Ramcke Donnerstag, 2. Dezember 2010 12:12 Korrektur
    Donnerstag, 2. Dezember 2010 11:45
  • Jetzt wieder zu unserer kleinen Zeile: Dim enc as Encoding.Default

    naja, diese Zeile sah von mir nie so aus.
    Mein letzter Versuch  (da doch sehr simples Grundlagen-Thema), hier ein minimal Test-Beispiel 

    Module Module1
     Sub Main()
      Dim ellen As System.Text.Encoding = EllenEncoding.Default
      Dim buffer() As Byte = ellen.GetBytes("Hallo Welt")
     End Sub
    
     Public MustInherit Class EllenEncoding
     Public Shared ReadOnly Property [Default] As System.Text.Encoding
      Get
      Dim enc1252 As System.Text.Encoding = System.Text.Encoding.GetEncoding(1252)
      Return enc1252
      End Get
     End Property
     End Class
    End Module
    
    
    Donnerstag, 2. Dezember 2010 11:47
  • Na Gut. In der msdn Doku werden nur die Definitionen angezeigt. Das sollte idR auch genügen. Der Code, welcher dahinter steht kann alles mögliche sein und ist für den Anwender dieser Klassen eigentlich eine Black Box.
    Ellen,
    in meinem Bsp unten habe ich auch gezeigt, wie man selber solche Accessoren schreiben kann, was in der Praxis durchaus vorkommt und zum Grundlagenwissen selbstverständlich ist.
    Donnerstag, 2. Dezember 2010 11:50