Practical tips for keeping your C# code base clean

dennisdoomen 4 views 43 slides Oct 31, 2025
Slide 1
Slide 1 of 45
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45

About This Presentation

As soon as a codebase grows to a certain point, almost every team struggles to keep that codebase under control. Coding conventions are no longer followed, code reviews become superficial, refactoring doesn't happen as often as it should, and developers lose sight of the original architecture. F...


Slide Content

40 practical tips for keeping your C# code base healthy Dennis Doomen @ddoomen | Principal Consultant | Microsoft MVP

About Me Coding Architect .NET/C# Bit of TS/JS/React/Vue 29 years of “pro” experience Author of FluentAssertions , Pathy, PackageGuard , Reflectify , .NET Library Starter Kit www.dennisdoomen.com BlueSky, Twitter, Mastodon, LinkedIn

Establish clean source control guidelines

Establish (HTTP) exception and logging guidelines

Merge microservices that don't need independent scaling µService µService µService µService µService µService µService µService µService µService µService µService µService µService µService µService Modular Monolith µService µService µService µService Service Service Service Service Service Service

Align projects with the deployment or reusability scope

Make the folder structure explain the architecture

Keep concrete classes internal by only exposing an interface

Use . editorconfig and Prettier to automatically format code

Use .NET analyzers and ESLint to get early code quality feedback

Use JetBrain’s Cleanup Profiles for auto clean-up

Use directory.build.props and . editorconfigs to gradually enforce standards

Document the purpose of code, not how it does that

Organize code by functionality

Clarify code review comment intent https://github.com/erikthedeveloper/code-review-emoji-guide

Consider Central Package Management Directory.packages.props MyProject.csproj y

Name and group tests functionally

Use a well-known branching strategy

Split refactoring commits from the rest

Use fixup commits and interactive rebases

Reduce dependencies on unstable packages Main Package Application More stable package Contract Contract Source-only package Auxiliary Package Optional Dependency Dependency Package

Refactor using the Rule of Three

Keep code internal

Use PolySharp to use newer C# features

Shared Module Module 1 Deduplicate complicated reusable code Complicated logic Module 2 Complicated logic Module 3 Complicated logic Module 1 Complicated logic Module 2 Module 3 Shared Module

Duplicate and simplify Shared Module Module 1 Simplified logic Module 2 Simplified logic Module 3 Simplified logic Module 1 Overly generic code Module 2 Module 3 Shared Module

Split shared projects to reduce dependencies Shared Project Project 1 Project 2 Project 3 Project 1 Project 2 Project 3 Shared Project Shared Project Shared Project

Replace lots of dependencies with a single reversed interface MyController ISomeRepository IExternalService IOtherModule Specific interface Adapter ISomeRepository IExternalService IOtherModule MyController

Get rid of separate validators and query/handlers patterns Finance Controller Some Request Handler Request validator IValidate < RequestValidator > IHandle < SomeRequestQuery >

Don’t forget the OO principles

Replace List<T> or Dictionary<T> with a custom collection class Order OrderLine List< OrderLine > Order OrderLine OrderLineCollection

Don't introduce interfaces if you don't need them

Move container registrations into the functional folder

Split bloated interfaces Finance Service IFinanceService Finance Service IProvideVatRates ICalculateIncomeTaxes ITransactionHistory

Replace single-method interfaces with delegates

Ensure every PR makes the code a little bit better

Use // REFACTOR and // SMELL comments https://www.infoq.com/articles/natural-course-refactoring/

Keep your licenses in check

Learn to use AI assistants and agents

Spell check your code

Replace Bicep & Terraform with Pulumi

Switch to GitHub and Dependabot or adopt Renovate

Use Nuke to evolve your build script over time

Learn from others

Find me at bluesky : @ddoomen.bsky.social mastodon : @ddoomen.mastodon.social twitter : ddoomen email : [email protected]