string - Verweistyp und Wertetyp



  • Hallo,

    string ist doch auch Verweistyp. Warum erzeugt dann das

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class testclass
        {
            public string _t;
    
            public testclass(string t)
            {
                _t = t;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                string str = "wwe";
    
                testclass tc = new testclass(str);
    
                Console.WriteLine(tc._t);
    
                str = "222";
    
                Console.WriteLine(tc._t);
    
            }
        }
    }
    

    Diese Ausgabe:
    wwe
    wwe
    ?

    Warum ändert sich der String in der Klasse nicht nach str="222"?

    C.



  • Weil System.String immutable ist.


  • Administrator

    Firefighter schrieb:

    Weil System.String immutable ist.

    Nein, das ist nicht der Grund. Dies trifft nur auf die Funktionen zu, welche alle so implementiert wurden, dass man den Inhalt von String nicht verändern kann.

    @Curtis Newton,
    "222" und "wwe" sind string Objekte. Die Zuweisung ist nichts anderes als eine Referenzzuweisung. Du nimmst plötzlich an, dass die Zuweisung wie bei einem Wertetyp passieren soll und eine Kopie durchgeführt werden sollte. Das ist aber eben nicht der Fall. Wie du sagst, es ist ein Referenztyp.

    Grüssli



  • Dravere schrieb:

    Firefighter schrieb:

    Weil System.String immutable ist.

    Nein, das ist nicht der Grund. Dies trifft nur auf die Funktionen zu, welche alle so implementiert wurden, dass man den Inhalt von String nicht verändern kann.

    @Curtis Newton,
    "222" und "wwe" sind string Objekte. Die Zuweisung ist nichts anderes als eine Referenzzuweisung. Du nimmst plötzlich an, dass die Zuweisung wie bei einem Wertetyp passieren soll und eine Kopie durchgeführt werden sollte. Das ist aber eben nicht der Fall. Wie du sagst, es ist ein Referenztyp.

    Grüssli

    Stimmt 😃 Da war ich zu voreilig 😃



  • Was müsste man ändern, damit das funktioniert? Nehmen wir an, man möchte eine String-Referenz als Member haben. Wie kann man das realisieren?



  • class Program
        {
            static void Main(string[] args)
            {
                string str = "wwe";
    
                testclass tc = new testclass(str);
    
                Console.WriteLine(tc._t);
    
                tc._t = "222";
    
                Console.WriteLine(tc._t);
    
            }
        }
    


  • löklökl schrieb:

    Was müsste man ändern, damit das funktioniert? Nehmen wir an, man möchte eine String-Referenz als Member haben. Wie kann man das realisieren?

    Am Besten spart man sich das, das trieft förmlich vor "C++"-denkweise 😉

    Aber man kann es so machen (kurz in LINQPad gehackt, deshalb freie Main-Funktion):

    void Main()
    {
    	StringBuilder sb = new StringBuilder();
    	sb.Append("www");
    
    	testclass tc = new testclass(ref sb);
    	Console.WriteLine(tc._t.ToString());
    
    	sb.Append("222");
    
    	Console.WriteLine(tc._t.ToString()); 	
    }
    
    // Define other methods and classes here
    class testclass
    {
    	public StringBuilder _t;
    
    	public testclass(ref StringBuilder t)
    	{
    		_t = t;
    	}
    }
    

    Ausgabe:

    www
    www222
    

  • Administrator

    @GPC,
    Das ref ist da gar nicht nötig. Das ref wäre nur nötig, wenn du die übergebene Referenz verändern möchtest, also worauf sb referenziert.
    Also auch ohne ref referenzieren danach alle StringBuilder Variablen auf das gleiche Objekt.

    Anonsten stimme ich dir zu, dass dies wohl eher ein falscher Ansatz ist und zu stark nach "C++" oder ähnliches riecht.

    Grüssli



  • Dravere schrieb:

    @GPC,
    Das ref ist da gar nicht nötig. Das ref wäre nur nötig, wenn du die übergebene Referenz verändern möchtest, also worauf sb referenziert.

    Ich weiß schon 😉 Aber wenn schon Referenzierung, dann richtig 🤡


Anmelden zum Antworten