readonly in struct ist nicht wirklich readonly


  • Administrator

    Th69 schrieb:

    Das 'readonly' entspricht somit dem C++ 'const', d.h. die Variable muß im Konstruktor (bzw. unter C++ geht ja nur in der Initialisierungsliste des Konstruktors) gesetzt werden. Und auch dort wird natürlich bei einer Kopie des Objekts das 'const'-Element mitkopiert.

    Genau dieser Vergleich geht eben nicht. Wie Bashar sagt, würde dies in C++ verhindert werden.

    Ich finde dieses Verhalten in C# sehr verwirrend. Ein readonly Feld in einer Klasse verändert sich nicht, weil bei der Zuweisung nur die Referenz auf das Objekt kopiert wird. Bei einer Struktur dagegen kann es sich verändern. readonly ist somit inkonsistent und variiert vom Verhalten her zwischen Klasse und Struktur.

    readonly in Verbindung mit Strukturen scheint wohl allgemein ein wenig seltsam zu reagieren. Vor kurzem auch dies hier gefunden, falls das jemand nicht kennt.

    struct Test
    {
      private int m_x;
    
      public int X
      {
        get { return m_x; }
        set { m_x = value; }
      }
    
      public Test(int x)
      {
        m_x = x;
      }
    
      public void SetX(int x)
      {
        m_x = x;
      }
    }
    
    class Program
    {
      private static readonly Test m = new Test(10);
    
      public static void Main(string[] args)
      {
        Console.WriteLine(m.X);
        // m.X = 20; wird nicht kompilieren
        m.SetX(20); // kompiliert
        Console.WriteLine(m.X); // gibt 10 aus
      }
    }
    

    @Zeus,
    Nein, ich bin eigentlich sehr klar heute. Endlich etwas ausgeruht von dem vielen Stress in den letzten Wochen. Ich empfinde das Verhalten irgendwie als verkehrt und das Schlüsselwort somit auch als irreführend. Oder ich überseh einfach etwas. Mich erstaunt, dass du dieses Verhalten erwartet hättest. Kanntest du dieses Verhalten schon?

    @loll,
    Tut mir Leid, falls ich nicht allwissend bin. Wenn du daher denkst, dass darunter die Qualität von diesem Forum zu sehr leidet, dann steht es dir frei, uns zu verlassen.

    Edit: Dieses Verhalten ist mir übrigens überhaupt erst aufgefallen, als Resharper mir vorgeschlagen hat, das Feld readonly zu machen und ich mir gedacht habe: "Dass würde doch das Verhalten der Struktur ändern?" 😉

    Grüssli



  • @Dravere: Ich hab auch gerade nochmal in der MSDN und im Standard nachgeschaut und dort wird das readonly Schluesselwort immer im Zusammenhang mit Klassen beschrieben. Mir scheint also als wenn sie da geschlampt haben. Kannst ja mal bei Microsoft nen Ticket auf machen und mal schauen was die dazu sagen 🙂



  • Sorry, für meine mißverständliche Analogie zu C++.
    Ich meinte bei C++ auch eher einen Copy-Konstruktor (denn wie Bashar angemerkt hat, kann man mit einem Zuweisungsoperator nicht mehr den const-Member überschreiben).

    Aber jetzt verstehe ich auch, warum Dravere diese Frage gestellt hat 😉

    Firefighter: ich hatte doch geschrieben, daß man in C++ eben die Initialisierungsliste benutzen muß (anstatt im Konstruktor-Rumpf)...



  • Sorry fuer den Doppelpost, aber ich hab was gefunden.
    Schau mal hier das beschreibt eigentlich dein direktes Vorgehen und wurde anscheind schon gemeldet.
    http://connect.microsoft.com/VisualStudio/feedback/details/92035/changing-readonly-struct-through-method-fails-silently#details

    @Th69: Sorry stimmt, nicht gelesen 🙂


  • Administrator

    Firefighter schrieb:

    Schau mal hier das beschreibt eigentlich dein direktes Vorgehen und wurde anscheind schon gemeldet.
    http://connect.microsoft.com/VisualStudio/feedback/details/92035/changing-readonly-struct-through-method-fails-silently#details

    Das ist das andere seltsame Verhalten in meinem zweiten Beitrag. Ist aber anscheinend "as by design", auch wenn es völlig seltsam wirkt.

    Informationen darüber, dass ein readonly Feld einfach überschrieben wird in einer Struktur, konnte ich nirgends finden. Wie du richtig bemerkt hast, wird readonly in der MSDN nur anhand von Klassen beschrieben. Und ich habe bisher noch keine Seite gefunden, welche readonly im Falle von Strukturen erklärt.

    Deshalb habe ich schlussendlich hier auch den Thread eröffnet. So eine ganz unüberlegte Handlung war das schon nicht 😃

    Grüssli



  • Also ich hätte das Verhalten auch so erwartet wie es der Compiler gemacht hat. Sonst würdest du ja auch erwarten dass ein readonly als static aggiert. Oder übersehe ich hier was? 😃



  • @Dravere: Deshalb sag ich: Mach mal nen Ticket bei MS auf 😃 Ne Stellungnahme dazu wuerde mich aber auch mal interessieren 🙂


  • Administrator

    Patrickssj6 schrieb:

    Also ich hätte das Verhalten auch so erwartet wie es der Compiler gemacht hat. Sonst würdest du ja auch erwarten dass ein readonly als static aggiert. Oder übersehe ich hier was? 😃

    Du übersiehst hier, dass man readonly Felder im Konstruktor initialisieren kann. Sie können somit einen anderen Wert pro Objekt haben und sind somit nicht statisch. Sonst kannst du nämlich const verwenden und dort musst du dann auch kein static hinschreiben.

    @Firefighter,
    Ich habe ganz schlechte Erfahrungen mit der Kontaktaufnahme bei Microsoft gemacht. Im allgemein hat es bei mir bisher schlicht und einfach nicht funktioniert, bzw. es kam keine Antwort 😃
    Aber was soll ich dort denn fragen? Ob das ein Bug ist? Da kenne ich die Antwort jetzt schon: "No! Closed as by design!" 😉
    Bringt mich nicht weiter.

    Ich hatte gehofft, dass hier jemand mehr wüsste. Bevor ich mich nämlich an MS wende, werde ich mir mal den C# Standard vornehmen.

    Grüssli



  • @Dravere:

    Im Standard steht im Kapitel zu readonly leider auch nichts zum Thema Structs.



  • Dravere schrieb:

    @Zeus,
    .... Ich empfinde das Verhalten irgendwie als verkehrt und das Schlüsselwort somit auch als irreführend. Oder ich überseh einfach etwas. Mich erstaunt, dass du dieses Verhalten erwartet hättest. Kanntest du dieses Verhalten schon?

    Ja, fehlende Gedanken über Transitivität von Eigenschaften im Zusammenhang zwischen Klassen und Strukturen sind mir bekannt.


  • Administrator

    Firefighter schrieb:

    Im Standard steht im Kapitel zu readonly leider auch nichts zum Thema Structs.

    Du müsstest womöglich eher schauen gehen, was bei der Kopie von Strukturen steht. Wenn dort einfach steht, dass ein memcpy oder dergleichen gemacht wird, dann ist es "klar".

    Grüssli



  • Dravere schrieb:

    Firefighter schrieb:

    Im Standard steht im Kapitel zu readonly leider auch nichts zum Thema Structs.

    Du müsstest womöglich eher schauen gehen, was bei der Kopie von Strukturen steht. Wenn dort einfach steht, dass ein memcpy oder dergleichen gemacht wird, dann ist es "klar".

    Grüssli

    Das würde 11.3.3 Assignment / 11.3 Class and struct differences sein, worin readonly nicht eingegangen wird, aber dort wird halt generell auf die das Kopierverhalten hingewiesen.


Anmelden zum Antworten