Benutzer mit den meisten Antworten
Verständnisfrage zur DOT Schreibweise in Visual Basic

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
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
-
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
-
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
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
-
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
-
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,
Dieses Byte-Array kannst Du über in einen Stream lesen (Read ) und schreiben (Write ).
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.
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
-
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 -
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
-
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
-
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
-
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
-
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
-
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.