| |
VB.NET - Ein- und UmsteigerIst string wirklich reference/class variable-typ? | | | Autor: otto-mueller | Datum: 11.04.13 13:58 |
| Hallo zusammen,
in VB.net und C# evtl. in anderen Sprachen ist doch String eine Klasse im Gegensatz von Integer oder?
Das wollte ich mit dem folgenden Code testen, aber dabei habe ich festgestellt, dass der String-Typ ein Wert-Typ ist und kein Referenz-Typ?!?
Dim txt1 As String
Dim txt2 As String
txt1 = "ABC"
txt2 = txt1
txt2 = "DEF"
Console.WriteLine("txt1: {0} --- txt2: {1}", txt1, txt2) als Ergebnis müssten doch txt1 und txt2 "DEF" zurückgeben, da beide auf dasselbe Objekt zeigen und das Objekt ja zum Schluss durch txt2 verändert auf "DEF" gesetzt wird.
Was mache ich denn falsch bzw. wo ist denn mein Denkfehler?
Danke vorab.
Viele Grüße
Otto | |
Re: Ist string wirklich reference/class variable-typ? | | | Autor: Preisser | Datum: 11.04.13 14:05 |
| Hallo,
dein Denkfehler ist, dass ein String ja unveränderlich ist, und durch die Zeile
txt2 = "DEF" in der Variable "txt2" eine Referenz auf ein neues String-Objekt gesetzt wird (Inhalt "DEF"), während die Variable "txt1" immer noch die Referenz auf das alte String-Objekt ("ABC") enthält.
Dim txt1 As String
Dim txt2 As String
txt1 = "ABC"
txt2 = txt1
Console.WriteLine(Object.ReferenceEquals(txt1, txt2)) ' True
txt2 = "DEF"
Console.WriteLine(Object.ReferenceEquals(txt1, txt2)) ' False Für eine Art veränderliche Strings gibt es beispielsweise den StringBuilder.
Dim sb1 As New StringBuilder()
Dim sb2 As StringBuilder = sb1
sb1.Append("Hallo")
Console.WriteLine(sb2.ToString()) ' gibt "Hallo" aus
Beitrag wurde zuletzt am 11.04.13 um 14:15:32 editiert. | |
Re: Ist string wirklich reference/class variable-typ? | | | Autor: otto-mueller | Datum: 11.04.13 14:49 |
| Hallo Preisser,
danke für die prompte Antwort.
Das heißt, dass String eine Sonderklasse ist bzw. er wird gesondert behandelt?
Denn bei "normalen" Klassen ist es doch wie ich es dachte so wie im Code unten oder?
Class Kunde
Private _vorname As String
Property Vorname()
Get
Return _vorname
End Get
Set(value)
_vorname = value
End Set
End Property
End Class
Sub Main()
Dim Kd1 As New Kunde
Dim Kd2 As New Kunde
Kd1.Vorname = "Otto"
Console.WriteLine("Kd1 Vorname: {0}", Kd1.Vorname)
Kd1 = Kd2
Kd2.Vorname = "Hans"
Console.WriteLine("Kd2 Vorname: {0}", Kd2.Vorname) 'Das gibt Hans aus.
Console.WriteLine("Kd1 Vorname: {0}", Kd1.Vorname) 'Aber auch der
' Kd1.Vorname ist geändert.
End Sub Gruß
Otto | |
Re: [Frage gelöst] Danke! "die String-Klasse hat einige Besonderheiten" | | | Autor: otto-mueller | Datum: 11.04.13 15:59 |
| Hallo,
danke Euch beiden für die Hilfe.
Jetzt kappiere ich es auch.
Bis demnächst
Viele Grüße
Otto
Beitrag wurde zuletzt am 11.04.13 um 16:00:22 editiert. | |
Re: [Frage gelöst] Danke! "die String-Klasse hat einige Besonderheiten" | | | Autor: DaveS (Moderator) | Datum: 11.04.13 17:57 |
| Eigentlich hat es nichts damit zu tun, dass String unveränderlich ist, sondern, dass du eine Referenz auf ein anderes Objekt zuweist. Unveränderlich bedeutet, zB, dass du wohl
Dim s As String = "xyz"
Dim c As Char = s(0) schreiben kannst, aber
s(0) = c nicht geht, weil der s(n) (ist gleich s.Chars(n)) readonly ist. Der Inhalt kann nicht geändert werden.
Bei deinem zweiten Beispiel mit eigenen Klassen setzst du den Wert durch ein Property. Die dritte Zuweisung existiert nicht. String hat natürlich keine Properties, die man so setzen kann. Wenn du im zweiten Beispiel die Zuweisungen anders machst eher wie beim ersten Beispiel
Dim Kd1 As New Kunde
Kd1.Vorname = "Otto"
Kd2 = Kd1 ' (ist auch umgekehrt!)
Kd2.Vorname = "Willi" ' Kd1.Vorname = jetzt "Willi"
Kd2 = New Kunde ' entspricht quasi txt2 = "DEF"
Kd2.Vorname = "Hans" ' Kd1.Vorname = immer noch "Willi" dann sind die Werte auch nicht gleich.
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist | |
String und Stringbuilder | | | Autor: Manfred X | Datum: 12.04.13 10:10 |
| Von Interesse ist in diesem Zusammenhang die
unterschiedliche Arbeitsweise der Methoden
bei Variablen des Typs String bzw. Stringbuilder:
Dim str As String = "abc"
str.Replace("b", "xx")
'Keine Wirkung auf den Inhalt der Variable "str"
Dim str2 As String = str.Replace("b", "xx")
'NUR Variable "str2" enthält modif. String
Dim stb As New System.Text.StringBuilder("abc")
stb.Replace("b", "xx") 'Die Zeichenfolge in "stb" ist geändert
stb.Clear()
stb.Append("abc")
Dim stb2 As System.Text.StringBuilder = stb.Replace("b", "xx")
'BEIDE Variablen verweisen auf die modif. Zeichenfolge "axxc"
Beitrag wurde zuletzt am 12.04.13 um 10:27:54 editiert. | |
Re: Danke! - String und Stringbuilder | | | Autor: otto-mueller | Datum: 12.04.13 11:17 |
| Hallo zusammen,
danke für die interessanten Hinweise und die ausführlichen Beispiele.
Jetzt ist mir Einiges klarer geworden.
Viele Grüße
Otto | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|