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

Improve Visual Studio Build Performance

Time is your most precious asset and slow build is high in the list of developer’s productivity killers. With slow build the penalty is twofold: not only the time taken...
Patrick Smacchia August 11, 2023

Class vs Struct in C#: Making Informed Choices

In C# programming, choosing the right data type between classes and structs is a crucial decision that impacts application performance and design. This article presents a concise comparison of Class vs...
Patrick Smacchia August 1, 2023

Improved .NET Debugging Experience with Source Link

Source Link is a Microsoft technology that lets .NET developers debug the source code of NuGet packages referenced by their applications. I underlined source code because at debugging time the...
Patrick Smacchia June 20, 2023

.NET Micro-Optimization and Refactoring Trick

Recently, I made an interesting observation regarding Dictionary<string,T>: the method TryGetValue() is faster when building  with new Dictionary<string,T>(StringComparer.Ordinal). This performance difference can be attributed to the fact that StringComparer.Ordinal performs...
Patrick Smacchia May 31, 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-650b765deb7f8213461133/] C#12 introduces primary constructor for non-record class and struct but beware,...
Patrick Smacchia April 13, 2023

In the Jungle of .NET Obfuscator Tools

In this article I will explain our genuine experience with various .NET Obfuscator Tools. We end up explaining that .NET Reactor is the one we choose to obfuscate our code...
Patrick Smacchia April 10, 2023

.NET Decompilers Compared: A Comprehensive Guide (2023)

Looking to reverse engineer or disassemble some .NET code? Then learning how to decompile .NET assemblies is a an essential skill for any .NET developer or security engineer. Fortunately, there...
Patrick Smacchia March 14, 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

C# ValueTuple

C# 7.0 introduced Value Tuples which represent both a set of structures in the .NET Base Class Library (BCL) and some convenient C# syntax. Value tuples are available in all...
Patrick Smacchia January 31, 2023

The NDepend GitHub Action is now available!

NDepend is a tool for .NET developers and teams that assesses the code quality within the IDE and the CI-CD process. With 17 years of existence and over 12.000 companies...
Patrick Smacchia January 25, 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-650b765ded72d364336858/] 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

Visual Studio vs. Jetbrains Rider Performance

I work daily with Visual Studio since 1997 but still use Rider from time to time to keep up with progresses since we plan to also integrate our NDepend extension...
Patrick Smacchia June 28, 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

WPF / Winforms UI Refactoring: A Case Study

WPF and Winforms are still so massively used that Microsoft fully supports those technologies in .NET Core, .NET 5, 6 , 7 and so on. However WPF and Winforms are...
Patrick Smacchia May 11, 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

How to collect return values from Parallel.ForEach?

Today I took 10 minutes to answer the 9 years old stackoverflow’s question: How do I collect return values from Parallel.ForEach? I though the improved solution deserved a quick blog...
Patrick Smacchia January 26, 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-650b765df09a5221121662/] Nice and...
Patrick Smacchia November 23, 2021

Solution to Visual Studio 2022 messing up Visual Studio 2019

As all .NET developers I am quite excited by Visual Studio 2022 and .NET 6 going RTM. However I noticed that Visual Studio 2022 RTM install messed up Visual Studio...
Patrick Smacchia November 10, 2021

5x Lessons Learned from Migrating a Large Legacy to .NET 5/6

In January 2020 I wrote the post Not planning now to migrate your .NET 4.8 legacy, is certainly a mistake. Hopefully we followed our own advice and have been migrated...
Patrick Smacchia October 26, 2021