C# in der Praxis: Fallstudien von Stack Overflow bis Unity

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum C# nicht nur für „Enterprise“ und Langeweile steht

\n\n

In der IT-Welt hält sich hartnäckig das Vorurteil: C# sei eine Sprache für langweilige Enterprise-Projekte, Banksysteme und Behördenseiten. Doch wer Vorurteile ablegt, stellt schnell fest: Stack Overflow, Unity, Teile von Visual Studio und sogar JetBrains Rider wurden mit C# entwickelt. Schauen wir uns reale Fallstudien von Unternehmen an, die C# in der Produktion einsetzen, und analysieren den dahinterstehenden Code.

\n\n

Dieser Artikel ist keine trockene Theorie, sondern eine Analyse lebendiger Projekte mit Beispielen, die Sie für Ihre eigenen Aufgaben anpassen können. Los geht's.

\n\n

Fallstudie 1: Stack Overflow – Wie C# eine Milliarde Anfragen pro Monat stemmt

\n\n

Stack Overflow ist wohl das bekannteste Beispiel für den Einsatz von C# in einem hochskalierbaren Projekt. Die Website verarbeitet über eine Milliarde Seitenaufrufe pro Monat und läuft auf ASP.NET MVC (inzwischen .NET Core) mit Redis und Elasticsearch.

\n\n

Die Architektur und warum C#?

\n

Das Stack Overflow-Team entschied sich für C# aufgrund der Leistungsfähigkeit, der strengen Typisierung und der hervorragenden Unterstützung für Multithreading. Ein entscheidender Faktor: Sie verwenden nur minimal externe Bibliotheken. Sie haben ihr eigenes ORM (Dapper) und eine eigene Caching-Schicht entwickelt.

\n\n

Codebeispiel: Hochleistungs-Cache mit Redis

\n

Eines der Geheimnisse der Geschwindigkeit von Stack Overflow ist aggressives Caching. So könnte ihr Ansatz für die Arbeit mit Redis über StackExchange.Redis aussehen:

\n\n
public class CacheService\n{\n    private readonly IDatabase _cache;\n    private readonly TimeSpan _defaultExpiry = TimeSpan.FromMinutes(10);\n\n    public CacheService(IConnectionMultiplexer redis)\n    {\n        _cache = redis.GetDatabase();\n    }\n\n    public async Task<T> GetOrSetAsync<T>(string key, Func<Task<T>> factory)\n    {\n        // Versuch, aus dem Cache zu laden\n        var cached = await _cache.StringGetAsync(key);\n        if (cached.HasValue)\n        {\n            return JsonSerializer.Deserialize<T>(cached);\n        }\n\n        // Falls nicht vorhanden, Factory aufrufen und speichern\n        var value = await factory();\n        var serialized = JsonSerializer.Serialize(value);\n        await _cache.StringSetAsync(key, serialized, _defaultExpiry);\n        return value;\n    }\n}\n
\n\n

Was ist das Besondere daran? Sie cachen nicht einfach alles – sie verwenden das Cache-Aside-Muster und setzen die TTL (Lebensdauer) abhängig vom Datentyp. Für die Fragenliste sind es z. B. 30 Sekunden, für ein Benutzerprofil 5 Minuten.

\n\n

Fallstudie 2: Unity – C# als Sprache für Spiele und 3D

\n\n

Unity ist die führende Spiele-Engine für Indie-Entwickler und große Studios. Der Kern ist in C++ geschrieben, aber das gesamte Scripting für Spiele erfolgt in C#. Über 50 % der mobilen Spiele weltweit basieren auf Unity – darunter nicht nur „Angry Birds“, sondern auch Hearthstone oder Pokémon GO.

\n\n

Warum C# und nicht C++?

\n

Unity entschied sich für C# wegen der guten Balance: Es ist schneller als Python oder JavaScript, aber sicherer und einfacher als C++. Der Garbage Collector (GC) kann zwar eine Herausforderung sein, aber in Unity hat man gelernt, ihn zu kontrollieren.

\n\n

Codebeispiel: Optimierung durch Objekt-Pooling

\n

In Spielen werden oft Objekte erstellt und zerstört (Kugeln, Gegner, Partikel). Um Ruckler durch den GC zu vermeiden, wird das Object Pool-Muster verwendet. So sieht das in C# aus:

\n\n
public class BulletPool : MonoBehaviour\n{\n    private Queue<Bullet> _pool = new Queue<Bullet>();\n    [SerializeField] private Bullet _bulletPrefab;\n\n    public Bullet Get()\n    {\n        if (_pool.Count > 0)\n        {\n            var bullet = _pool.Dequeue();\n            bullet.gameObject.SetActive(true);\n            return bullet;\n        }\n        return Instantiate(_bulletPrefab);\n    }\n\n    public void Return(Bullet bullet)\n    {\n        bullet.gameObject.SetActive(fa                

Blogs

Buchempfehlungen