Code Review in C#: Was prüfen und wie man Feedback gibt
Code Review ist keine bloße Formalität, sondern einer der Schlüsselprozesse zur Sicherstellung der Codequalität. Besonders wichtig ist dies für Projekte in C# und .NET, wo hohe Leistung, Lesbarkeit und die Einhaltung moderner Standards eine entscheidende Rolle spielen. In diesem Artikel analysieren wir, worauf bei der Überprüfung von C#-Code zu achten ist und wie man Feedback gibt, das nützlich und konstruktiv ist.
1. Architektur und Einhaltung der SOLID-Prinzipien
Bevor Sie sich konkrete Codezeilen ansehen, bewerten Sie die Gesamtarchitektur. In C# ist dies aufgrund der weit verbreiteten Nutzung der OOP besonders wichtig.
- Single Responsibility: Jede Klasse und Methode sollte eine einzige Aufgabe erfüllen. Wenn eine Methode zu viel tut, ist dies ein Grund für ein Review.
- Open/Closed: Prüfen Sie, ob die Funktionalität erweitert werden kann, ohne vorhandenen Code zu ändern (z. B. über Interfaces oder abstrakte Klassen).
- Dependency Injection: In .NET Core/5+ ist DI der Standard. Stellen Sie sicher, dass Abhängigkeiten über den Konstruktor übergeben werden und nicht innerhalb der Klasse erstellt werden.
// Schlecht: Verletzung von SRP und DIpublic class OrderService{ private readonly SqlConnection _connection = new SqlConnection("..."); public void ProcessOrder(Order order) { // Validierungslogik // Logik zum Speichern in der DB // Logik zum Senden von E-Mails }}
// Gut: Aufteilung in Dienste und DIpublic class OrderService{ private readonly IOrderRepository _orderRepository; private readonly IEmailService _emailService;
public OrderService(IOrderRepository orderRepository, IEmailService emailService) { _orderRepository = orderRepository; _emailService = emailService; }
public void ProcessOrder(Order order) { _orderRepository.Save(order); _emailService.SendConfirmation(order); }}2. Sicherheit und Fehlerbehandlung
Sicherheit ist ein kritischer Bestandteil jeder C#-Anwendung. Achten Sie auf folgende Aspekte:
- SQL-Injection: Verwenden Sie parametrisierte Abfragen oder Entity Framework, anstatt Strings zu verketten.
- Ausnahmen: Schlucken Sie keine Ausnahmen mit leeren
catch-Blöcken. Protokollieren Sie Fehler und verwenden Siefinallyzur Freigabe von Ressourcen. - Null-Sicherheit: Verwenden Sie in C# 8+ nullable reference types. Prüfen Sie Methodenargumente auf
null.
// Schlecht: Anfällig für SQL-Injectionvar query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
// Gut: Parametrisierte Abfragevar command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection);command.Parameters.AddWithValue("@name", userName);Prüfen Sie auch, ob die Anwendung Ausnahmen an Systemgrenzen korrekt behandelt (z. B. in ASP.NET Core-Controllern).
3. Leistung und Speicherverwaltung
C# ist eine Sprache mit automatischer Speicherverwaltung, aber das bedeutet nicht, dass die Leistung vernachlässigt werden kann. Achten Sie beim Review auf:
- LINQ-Abfragen: Vermeiden Sie mehrfache Iterationen über Sammlungen. Beispielsweise kann
.ToList()nach jedem.Where()die Leistung erheblich verlangsamen. - Asynchronität: Verwenden Sie
async/awaitfür I/O-Operationen, aber missbrauchen Sie nicht.Resultoder.Wait()– dies kann zu Deadlocks führen. - Objektpooling: Verwenden Sie für schwere Objekte (z. B. Datenbankverbindungen) Pooling, anstatt sie jedes Mal neu zu erstellen.
// Schlecht: Mehrfache Iterationenvar filtered = items.Where(x => x.IsActive).ToList();var sorted = filtered.OrderBy(x => x.Name).ToList