One user scenario to rule them all

The async series Dissecting the async methods in C#. Extending the async methods in C#. The performance characteristics of the async methods in C#. One user scenario to rule them all. Almost every non-trivial behavior of the async methods in C# can be explained based on one user scenario: migration of the existing synchronous code…

2

The performance characteristics of async methods in C#

In the last two blog posts we’ve covered the internals of async methods in C# and then we looked at the extensibility points the C# compiler provides to adjust the behavior of async methods. Today we’re going to explore the performance characteristics of async methods. As you should already know from the first post of…

3

Extending the async methods in C#

In the previous blog post we discussed how the C# compiler transforms asynchronous methods. In this post, we’ll focus on extensibility points the C# compiler provides for customizing the behavior of async methods. There are 3 ways how you can control the async method’s machinery: Provide your own async method builder in the System.Runtime.CompilerServices namespace….

3

Dissecting the async methods in C#

The C# language is great for developer’s productivity and I’m glad for the recent push towards making it more suitable for high-performance applications. Here is an example: C# 5 introduced ‘async’ methods. The feature is very useful from a user’s point of view because it helps combining several task-based operations into one. But this abstraction…

12

Dissecting the tuples in C# 7

System.Tuple types were introduced in .NET 4.0 with two significant drawbacks: (1) tuple types are classes and (2) there was no language support for constructing/deconstructing them. To solve these issues, C# 7 introduces new language feature as well as a new family of types (*). Today, if you need to glue together two values to…

7

Dissecting the pattern matching in C# 7

C# 7 finally introduced a long-awaited feature called “pattern matching”. If you’re familiar with functional languages like F# you may be slightly disappointed with this feature in its current state, but even today it can simplify your code in a variety of different scenarios. Every new feature is fraught with danger for a developer working…

13

Dissecting the local functions in C# 7

The Local functions is a new feature in C# 7 that allows defining a function inside another function. When to use a local function? The main idea of local functions is very similar to anonymous methods: in some cases creating a named function is too expensive in terms of cognitive load on a reader. Sometimes…

22

Managed object internals, Part 4. Fields layout

In the recent blog posts we’ve discussed invisible part of the object layout in the CLR: Managed object internals, Part 1. The Layout Managed object internals, Part 2. Object header layout and the cost of locking Managed object internals, Part 3. The layout of a managed array This time we’re going to focus on the…

3

Managed object internals, Part 3. The layout of a managed array

Arrays are one of the basic building blocks of every applications. Even if you do not use arrays directly every day you definitely use them indirectly as part of almost any library. C# has arrays from the very beginning and back in the day that was the only “generic”-like and type safe data structure available….

4

Managed object internals, Part 2. Object header layout and the cost of locking

Working on my current project I’ve faced a very interesting situation. For each object of a given type, I had to create a monotonically growing identifier with few caveats: 1) the solution should work in multithreaded environment 2) the number of objects is fairly large, up to 10 million instances and 3) identity should be…

6