CH NEO-ZÜRICH AUSGABE
WETTER · GRAU 20°C
BLEND DES TAGES · 07/ROGUE
EST. 2027
DIE AEC CYBER MORGENZEITUNG

PAZ Kaffi

DESIGN · ABBRUCH · KOFFEIN · DEPESCHE
AUSGABE 0818 · 18 August 2026
SENDUNG 04:42 MEZ
2'400 BOGEN GEDRUCKT
LESEZEIT · 47 MIN
Class, struct oder record: die dreifache Wahl auf 4000 Punkten
Code
FRAME · 07:00
18-08-2026

Class, struct oder record: die dreifache Wahl auf 4000 Punkten

C#-Tutorial für Computational Designer: wann Koordinaten kopieren und Modellelemente geteilt werden — Value vs Reference auf 4000 Punkten.

Frag einen Physiker, der zum Programmierer wurde, was ein Typ ist, und du bekommst eine klare Antwort: eine Vorlage für einen Speicherblock. Microsofts eigene C#-Dokumentation startet genau dort — eine class, struct oder record ist »wie eine Vorlage, die spezifiziert, was der Typ tun kann«, und ein Objekt ist »ein Speicherblock, der gemäss der Vorlage allokiert und konfiguriert wird«. Dieser eine Satz verbirgt die folgenreichste Entscheidung, die ein Computational Designer vor der ersten Zeile Geometrie trifft: ob das, was du modellierst, kopiert oder geteilt wird. Jedes Büro, das seine erste C#-Komponente schreibt, trifft am Ende auf die gleiche Wand — eine Liste von Stützpunkten, die sich hartnäckig weigert zu bewegen.

←HEUTE: C# 14.0 ist am 11. November 2025 ausgeliefert; class vs struct vs record ist eine Compile-Zeit-Entscheidung, keine Runtime-Zufälligkeit. →3012: die Studios, die noch stehen, sind die, deren value-vs-reference Disziplin aufgeschrieben wurde, nicht im Kopf der nächsten Praktikantin bewahrt. Drehpunkt: eine Koordinate, die kopieren soll, und ein Modellelement, das geteilt werden soll, brauchen gegensätzliche Typ-Arten — du siehst es nur klar, wenn du beide scheitern siehst.

Das Werkzeug: Dieses Tutorial baut auf dem freien, Open-Source .NET SDK und seinem dotnet Kommandozeilen-Werkzeug auf — Microsofts eigene Toolchain für C#, der Sprache, die von Anders Hejlsberg entworfen und jetzt von Mads Torgersen betreut wird. Laut Wikipedias C#-Seite erschien die Sprache zuerst im Juli 2000 und erreichte stabile Version 14.0 am 11. November 2025; der Roslyn-Compiler dahinter ist MIT-lizenziert. Es verdient einen Architekten-Nachmittag aus einem Grund: C# ist die Sprache der Grasshopper C#-Komponente und von RhinoCommon — wo Code auf Geometrie trifft in einem Rhino-basierten Studio. Lern es zuerst in einer schlichten Windows-Konsolen-App, und die Grasshopper-Komponente hört auf, einschüchternd zu sein.

System: die Vorlage hat Regeln, die du erbst

Die Microsoft-Dokumentation nennt Kapselung das »erste Säulenprinzip« der objektorientierten Programmierung — und ist unverblümt über die Voreinstellung: ein Member ist private, wenn du nicht anders sagst. Darüber hinaus weichen die drei Vorlagen absichtlich voneinander ab. Nur classes unterstützen Vererbung — eine class kann von einer Basisklasse abstammen und ihre öffentlichen, geschützten und internen Member übernehmen. Structs können nicht erben. Records fügen wertbasierte Gleichheit hinzu: zwei records sind gleich, wenn sie denselben Typ haben und jedes Feld gleich ist; zwei class-Instanzen sind nur dann gleich, wenn sie auf das gleiche Objekt zeigen. Die Dokumentation nennt drei weitere Record-Features, die sie zur richtigen Wahl für selten verändernde Daten machen: eine with Expression für nicht-destruktive Mutation (eine Kopie mit geänderten benannten Eigenschaften), ein eingebautes ToString, das Typname und öffentliche Eigenschaftswerte druckt, und — die zu merkende Asymmetrie — record classes unterstützen Vererbung, record structs nicht. Diese reference-vs-value Spaltung ist die ganze Geschichte, darum ist die Wahl eine Designentscheidung, keine Syntaxpräferenz.

Setup:

# Windows 11, PowerShell
winget install Microsoft.DotNet.SDK.9
dotnet --version            # 9.0.x confirms the SDK is live
dotnet new console -n SetOut
cd SetOut
dotnet run                  # prints: Hello, World!

Erste Schritte:

  1. Öffne Program.cs. Unter der generierten Zeile deklariere einen Punkt als struct: struct Pt { public double X; public double Y; }.
  2. Erstelle eine kleine List<Pt>, iteriere über sie und versuche, jedes X um 10 zu erhöhen. Führe dotnet run aus und lies die Compiler-Meldung.
  3. Ändere das Wort struct zu class, führe es erneut aus und beobachte, wie die gleiche Schleife plötzlich in-place mutiert. Dieser Wechsel — gleicher Code, gegensätzliches Verhalten — das ist die ganze Lektion.

Strasse: was kopiert, was wird geteilt

Eine class ist ein Referenztyp: zwei Variablen können auf ein Objekt zeigen, wie Spanien (2023), die amtierenden Fussball-Weltmeisterinnen, alle von einem einzigen Spielplan lesen — ändere den Plan, alle sehen die Änderung. Ein struct ist ein Werttyp: jede Variable kriegt ihre eigene Fotokopie. Loop über 4000 Stützpunkte, die als structs gespeichert sind, erhöhe jeden, und die Liste ändert sich nie — du hast 4000 verworfene Kopien mutiert. FIFA spielt sein Spiel von einem Hügel über Zürich aus; unser Studio, drei Tramhaltestellen weg in Kreis 5, spielt die gleiche Verwirrung in Code. Der Grasshopper C# Scripting-Guide von Ehsan Iran-Nejad bei McNeel trennt deshalb sorgfältig zwischen Sprachsyntax und Rhino API — der Aliasing-Bug ist ein C#-Merkmal, kein Rhino-spezifisches.

Atelier: In einem Rhino-basierten Schweizer Studio ist die Regel kurz: eine Koordinate, ein Parametersatz oder ein leichtes Tuple will ein struct oder ein record — billig, kopiert, ohne Aliasingüberraschungen; ein Modellelement, das viele Komponenten lesen und mutieren, will eine class. Die PAZ Grasshopper↔Archicad Library stützt sich auf genau diese Disziplin, damit Komponentenausgaben nie still Eingaben aliasieren. Dein Montag-Schritt: öffne deine am häufigsten wiederverwendete C#-Komponente und grep für jeden struct, den du in einem foreach mutierst — das ist eine Kopie, die du auf den Boden wirfst, und sie gehört auf deine Fehlerliste vor dem nächsten Wettbewerb.

Trick: Schau zu, wie eine Koordinate sich stumm weigert, in einer Schleife zu bewegen, und mach sie dann absichtlich. Das ist Wert-Semantik bei der Arbeit — der struct gibt dir eine Kopie, deshalb weigert sich der Compiler, den verwirrenden Schreibzugriff anzunehmen, und erzwingt explizites Read-Edit-Writeback.

struct Pt { public double X; public double Y; }
var pts = new List<Pt> { new() { X = 0, Y = 0 } };
foreach (var p in pts) p.X += 10;          // compile error: p is a read-only copy
for (int i = 0; i < pts.Count; i++)        // the honest fix
{ var q = pts[i]; q.X += 10; pts[i] = q; }  // read, edit, write back

Tausch struct gegen class und die erste Schleife kompiliert und mutiert in-place — bequem bis zu dem Moment, in dem zwei Komponenten das gleiche Objekt teilen und eine still die Geometrie der anderen neu schreibt.

Zug — Lernen:

  • Repo/Referenz: Grasshopper C# Scripting-Guide — developer.rhino3d.com/guides/scripting/scripting-gh-csharp (Ehsan Iran-Nejad, McNeel)
  • Dokumentation: Classes, structs, and records — Microsoft Learn
  • Wurzelkonzept: C# (programming language) — Wikipedia
  • PAZ-Notiz: wenn sich die class/struct/record Gewohnheit festsetzt, ist die Grasshopper C#-Komponente der nächste natürliche Schritt — ein separates PAZ-Special behandelt diese Überleitung.
GEMELDET AUS
MIT-UNTERZEICHNER
PAZ Academy
VERTRAUEN
HIGH
NACHDRUCKE
© PAZ - PARAMETRIC ACADEMY ZURICH · ALLE RECHTE VORBEHALTEN

QUELLE ·

PAZ Kaffi · interdisziplinäre Redaktionsarbeit, geleitet von der PAZ Academy

⚑ FEHLER MELDEN · KORREKTUR EINSENDEN
◂ ZURÜCK ZUR TITELSEITE · PAZ KAFFI

© 2026 PAZ Academy.