vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Ist 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Ist string wirklich reference/class variable-typ? 
Autor: powerzone3000
Datum: 11.04.13 15:19

Richtig, siehe auch hier, Punkt 6.1: http://openbook.galileocomputing.de/einstieg_vb_2010/einstieg_vb_2010_kap_06_001.htm

edit: Das ist evtl. auch interessant für dich: http://www.mycsharp.de/wbb2/thread.php?threadid=73679

Beitrag wurde zuletzt am 11.04.13 um 15:33:10 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: [Frage gelöst] Danke! "die String-Klasse hat einige Besonderheiten" 
Autor: ModeratorDaveS (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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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