Aber wie sieht es mit boxed Int aus:
int? a = 0;
Sieht für mich auch immutable aus.
Hm, also meiner Auffassung nach ist boxed int schon mal was ganz anderes als int?. Boxed int wäre eher sowas:
Object a = 0;
also die Zuweisung einer ValueType-Konstante (0) zu einer Variable eines Typs, der nicht von ValueType erbt, wodurch für diese Konstante Speicher auf dem Heap reserviert werden muss, während
int? a = 0;
eine Zuweisung der 0 zu einer Nullable<int> Struktur ist, die ganz ähnlich zu int von ValueType abgeleitet ist und der Begriff immutable damit Definitionssache ist. Nach untenstehender Definition wäre int? immutable, ja.
Aber erstmal zu mutable und immutable: Man kann immutable ja auch definieren als alles, was mit dem hübschen Attribut ImmutableObjectAttribute markiert ist - mit der Folge, dass man alles, was in der mscorlib steht schon mal vorweg ausklammert.
Meine Definition für mutable wäre die folgende: Eine Klasse heißt mutable, wenn sie als nicht vererbbar gekennzeichnet ist, nicht abstrakt ist und mindestens eine nicht statische, öffentliche Methode existiert, für die Parameter existieren, sodass diese Methode mindestens ein Feld (und damit den inneren Zustand des Objekts) derselben Instanz verändert. Nach IL-Sinn sind allerdings auch Property-Setter als Methoden zulässig.
Leider kann man die Implementierung von String im Reflector nicht sehen, aber anhand der Tatsache, dass keine öffentliche Methode von String dieselbe String-Instanz verändert sondern wenn schon denn schon eine neue String-Instanz zurückgibt, kann man schon sagen, dass String immutable ist. Bei Int16, Int32, Int64 und wie sie alle heißen sieht die Sache nicht anders aus, auch die sind immutable.
Interessanterweise sind aber nicht alle von ValueType erbenden Objekte immutable. Alle Enums sind immutable und alle in der mscorlib definierten Zahlendatentypen auch - aber System.Drawing.Size aus der System.Drawing ist beispielsweise mutable, allerdings sehe ich nicht wirklich einen Grund dafür, aber auch keinen dagegen (außer vielleicht, dass es erstmal verwirend ist).
Ach ja und
Es wird mit += oder so, kein neuer Bereich auf dem Heap allokiert
Doch, mit += wird neuer Speicher allokiert, da wie herbivore in seinem Beitrag auch geschrieben hat a += b zu a = a + b umgesetzt wird.