NDepend

Improve your .NET code quality with NDepend

Unveiling the Impressive Features of Upcoming C# 12

Microsoft unveils new features in C# 12 Preview. C# 12 along with .NET 8 will be officially released in November 2023. Let’s explore the latest impressive enhancements in this post....
Patrick Smacchia August 17, 2023

C# async await explained (2023)

In 2012, C#5 was released. This version introduced two new keywords async and await. At that time CPU clock speed reached an upper limit imposed by physical laws. But chip...
Patrick Smacchia August 16, 2023

C#12 class and struct Primary Constructors

Since C#9 we have the convenient primary constructor syntax for class record (or just record) and struct record: [crayon-6509c12cceb63964661941/] C#12 introduces primary constructor for non-record class and struct but beware,...
Patrick Smacchia April 13, 2023

Clean Architecture for ASP.NET Core Solution: A Case Study

In this post we’ll explore the Jason Taylor’s CleanArchitecture .NET solution template available here on github recently updated to support .NET 7. It illustrates well how an ASP.NET Core application...
Patrick Smacchia March 9, 2023

Deconstruction in C#

C# 7.0 introduced the deconstruction syntax. It allows developers to extract in a single expression, properties of an object or elements of a tuple and then to assign them to...
Patrick Smacchia January 18, 2023

The new .NET 7.0 IParsable<TSelf> interface

As I explained in the post C# 11 static abstract members, C# 11 let’s write static abstract members in interface. This feature was mostly introduced to implement the new .NET...
Patrick Smacchia November 21, 2022

C# 11 required members

C# 11 proposes the new keyword required that can apply to an instance property or an instance field declaration within a class, a record or a struct. [crayon-6509c12ccf9ea213343603/] This keyword...
Patrick Smacchia November 15, 2022

C# 11 File Scoped Types

C#11 added the file scoped types feature: a new file modifier that can be applied to any type definition to restrict its usage to the current file. This way we...
Patrick Smacchia October 27, 2022

Managed pointers, Span, ref struct, C#11 ref fields and the scoped keyword

The concept of managed pointer exists in the NET runtime and C# since the inception of the platform in the early 2000. Managed pointers belong mostly to the pointer world,...
Patrick Smacchia October 25, 2022

.NET Build Improvement: Stop Wasting Resources

I am working on .NET development full-time since 2002 and there is a point that still annoys me after all these years: the default .NET build behavior leads to a...
Patrick Smacchia October 4, 2022

Architecture of a .NET Application: Case Studies

Recently the question Number of projects per solution has been asked on reddit which led to interesting debates. Of course the answer depends largely on the overall size and business...
Patrick Smacchia September 13, 2022

C# 11 Raw String Literals Explained

C# 11 introduces Raw String Literals. Undoubtedly this feature will become very popular because it represents an elegant way to solve some issues with actual string literal. Let’s have a...
Patrick Smacchia August 25, 2022

C# 11 static abstract members

C# 11 proposed interface members declared as static abstract. This is useful to handle both: Polymorphism at the type level, for example when abstracting the concept of zero accross numeric...
Patrick Smacchia June 14, 2022

C# Pattern Matching Explained

Since the C# version 7, C# has support for pattern matching. C# pattern matching is here to simplify complex if-else statements into more compact and readable code. Pattern matching does...
Patrick Smacchia April 4, 2022

Improve C# code performance with Span<T>

C# 7.2 introduced the structure System.Span<T>. First we’ll present a concrete example where Span<T> helps achieve better performance. Then we’ll explain what makes Span<T> so special. Span<T> primary goal is...
Patrick Smacchia February 21, 2022

C# Binary Search: Fast find of a free slot between 0 and uint.MaxValue

When a user is exporting a result to a document with NDepend, the tool needs to find a file name not taken in the temporary dir. Generating a GUID for...
Patrick Smacchia January 3, 2022

Modern C# Hello World

With Visual Studio 2022 when you create a new console project based on .NET 6, the Hello World source code generated is now as simple as that: [crayon-6509c12cd1784023949062/] Nice and...
Patrick Smacchia November 23, 2021

Top 10 New .NET 6.0 API

.NET 6 introduces new handy APIs that will make our development journey easier. Let’s go through the top 10 new API in terms of usage likelyhood. Then in the conclusion,...
Patrick Smacchia July 7, 2021

How to Logically Name Embedded Resources in .csproj?

You can work with .NET for two decades and still discover some useful stuff.  One thing that bothered me till now is that an embedded resource name is “the project...
Patrick Smacchia June 16, 2021

Migrating Delegate.BeginInvoke Calls to .NET Core, .NET 5 and .NET 6

In this 2019 post, the .NET Base Class Library engineers announced that the good old Delegate.BeginInvoke .NET Framework syntax wasn’t supported in .NET Core and consequently in .NET 5, 6...
Patrick Smacchia May 26, 2021

Covariance and Contravariance in C# Explained

Introduction Covariance and contravariance allow more flexibility when dealing with C# class hierarchy. This article explains and demonstrates the concepts of Covariance and Contravariance in C# .NET. These concepts will...
Patrick Smacchia May 4, 2021

Clean Architecture Refactoring: A Case Study

Introduction to Clean Architecture The recent post Clean Architecture for ASP.NET Core Solution: A Case Study explained that one of the most interesting property promoted by Clean Architecture is the...
Patrick Smacchia April 27, 2021

Hungarian Notation for Fields in C#

If there is one topic that divides the C# developers community, it is the Hungarian notation for fields. In our team we rely on Hungarian notation for fields, not just...
Patrick Smacchia April 21, 2021

8 Books to Improve as a .NET Developer

Nowadays all information a developer needs to know is available online for free. Blogposts and videos authored by experts, giant questions and answers websites, a quick search and you get...
Patrick Smacchia March 31, 2021

How we quickly refactored with Resharper more than 23.000 calls to Debug.Assert() into more meaningful assertions

Since the NDepend inception more than 15 years ago, we stuffed our code with calls to Debug.Assert(). This results today in more than 23.000 assertions calls. Few developers realize that...
Patrick Smacchia January 11, 2021

The proper usages of Exceptions in C#

The C# exception basics are generally well understood. However exceptions are often used as a way to sweep error handling duty under the carpet. As I did in The proper...
Patrick Smacchia December 16, 2020

The proper usages of the keyword ‘static’ in C#

The keyword static is somewhat awkward in a pure Oriented-Object world. I would like to explain here what are the right usages of static I came up after 25 years of...
Patrick Smacchia December 8, 2020

Using C#9 record and init property in your .NET Framework 4.x, .NET Standard and .NET Core projects

C#9 record and C#9 init property are really nice addition to the language. As explained in C#9 records: immutable classes, both are syntactic sugar that don’t require any change at...
Patrick Smacchia November 25, 2020

C# Index and Range Operators Explained

C#8 added the index ^ and range .. operators. In this post I am attempting to demystify both in the most comprehensive way. The index operator ^ Let’s start with...
Patrick Smacchia November 16, 2020

C#9 records: immutable classes

Record is a long time awaited feature now proposed by C# 9. With record we have a concise syntax to define immutable types this way: [crayon-6509c12cd3c33521442801/] Isn’t it beautiful? In...
Patrick Smacchia October 12, 2020