Das bringt uns hier nicht weiter, da der int durch Boxing zu einem Referenztyp wird. Es gibt aber einen ganz anderen riesigen Unterschied zwischen den beiden Ausschnitten:
C#-Quelltext
1:
| ((Example)list2[0]).Foo = "blah"; |
C#-Quelltext
Die erste Zeile
ruft ein Objekt
ab und manipuliert seine Daten - da das Objekt in beiden Listen steckt, ist der Effekt auch über beide Listen beobachtbar.
Die zweite Zeile
ersetzt das Objekt an Index 0 durch das
neue Objekt "2". Das juckt das alte Objekt in der alten Liste aber wenig.
Der Code würde sich also nur entsprechen, wenn wir die erste Zeile umformulieren:
C#-Quelltext
1:
| list2[0] = new Example { Foo = "blah" }; |
Und schon haben wir den gleichen Effekt wie bei der int-Liste.
Zumindest in diesem Beispiel können wir nicht umgekehrt die zweite Zeile entsprechend der ersten umformulieren, da sich int-Objekte nicht manipulieren lassen. int ist
immutable, eine 3 wird immer eine 3 bleiben. Das ist zwar eine entscheidende Eigenschaft jedes ordentlich konstruierten Structs, aber bei Klassen ist das genauso möglich. Allgemein verhalten sich immutable Structs und immutable Klassen in ihrem Verhalten exakt gleich. int könnte auch eine Klasse sein - man würde es höchstens an der Performance bemerken.