Wofür Structs gut sind, sagt Microsoft doch selbst:
A struct type is a value type that is typically used to encapsulate small groups of related variables, such as the coordinates of a rectangle
Quasi sowas wie POD-Typen in C++ (nur, dass die da keine spezielle Syntax oder sowas haben) oder Records in Pascal.
Das Beispiel mit dem Rechteck ist auch recht passend, denn Rechtecke - sagen wir, sie bestehen aus vier floats oder ints oder sowas - sind genau so ein Fall, wo Java einfach gnadenlos versagt.
Möglichkeit 1: Wir schreiben uns eine Klasse Rechteck. Prinzipiell ja erstmal eine schöne Lösung. Aber:
- Das Rechteck kann null sein. Was soll der Schwachsinn?
- Spätestens, wenn wir Rechtecke als Funktionsparameter übergeben, muss zumindest bei der ersten Verwendung in der jeweiligen Funktion überprüft werden, ob das Rechteck nicht zufällig null ist.
- Noch bescheuerter wird es, wenn wir ein Rechteck zur späteren Verwendung in einer Struktur speichern wollen, dann landet es zwangsläufig auf dem Heap - und dann wird es
richtig ineffizient.
- Dieser ganze "wir schieben nur Referenzen hin und her"-Blödsinn sorgt nur dafür, dass wir von Hand einen Copy-Constructor schreiben müssen und im Code alles voller
new Rechteck(someRect) ist. Die Klasse muss immutable sein, damit wir nicht versehentlich ein von jemand anderem verwendetes Rechteck verändern.
Möglichkeit 2: Wir interpretieren jeweils 4 Floats als Rechteck. Es ist zur Laufzeit garantiert effizienter, aber
- Wir verlieren sämtliche Vorteile von OOP.
- Entsprechend blöd sieht es aus, sowas dann an Funktionen zu übergeben - soetwas zu returnen ist unmöglich.
In C++ existiert die Problematik gar nicht erst, in C# schreibt man sich nen Struct und ist glücklich.
Edit:
Deswegen sind C#/Java auch schlechte Wahl als erste Programmiersprache.
Amen.