Skip to content
Ian Griffiths - Technical Fellow I

Ian started using computers when he was six.

Meet Ian

Ian has worked in various aspects of computing, including computer networking, embedded real-time systems, broadcast television systems, medical imaging, and all forms of cloud computing. Ian is a Technical Fellow at endjin, and 17 times Microsoft MVP in Developer Technologies. He is the author of O'Reilly's Programming C# 12.0, and has written Pluralsight courses on WPF fundamentals (WPF advanced topics WPF v4) and the TPL. He's a maintainer of Reactive Extensions for .NET, Reaqtor, and endjin's 50+ open source projects. Ian has given over 20 talks while at endjin. Technology brings him joy.

View Blogs View Talks
C# 12.0: inline arrays

C# 12.0: inline arrays

Ian Griffiths

A new feature in C# 12.0 enables data types to define fixed-size arrays that don't require separate array objects on the heap. Learn how this is useful in performance-oriented and interop scenarios.
How .NET 9.0 boosted AIS.NET performance by 9%

How .NET 9.0 boosted AIS.NET performance by 9%

Ian Griffiths

.NET 9.0 has shipped, and for the fourth year running, we benchmarked endjin's AIS.NET library and were very happy to see substantial performance gains, with no extra work required.
Modern Compute: Compute-Intensive Workloads

Modern Compute: Compute-Intensive Workloads

Ian Griffiths

We have a wide range of computational mechanisms at our disposal, some of which emerged thanks to recent advances in AI. In this post, we look at the kinds of workloads that can take advantage of these.
C# 12.0: primary constructors

C# 12.0: primary constructors

Ian Griffiths

C# 12.0's most prominent new feature is the primary constructor syntax. This post describes how it works, and looks at some pros and cons.
Modern Compute: Unavoidable Practicalities

Modern Compute: Unavoidable Practicalities

Ian Griffiths

Thanks in part to recent advances in AI, we have a range of computational mechanisms at our disposal. However, certain universal truths apply to all of them.
C# 11.0 new features: ref fields and the scoped keyword

C# 11.0 new features: ref fields and the scoped keyword

Ian Griffiths

C# 11.0 expanded high-performance, low-allocation functionality. This post describes the importance of the added support for ref fields, and how the scoped keyword relates.
After the AI Storm: Modern Compute

After the AI Storm: Modern Compute

Ian Griffiths

Recent huge investment in AI has changed the modern computational landscape. Whatever the value of recent AI developments ultimately proves to be, we have some new hardware capabilities as a side effect. What else do these enable?
Per-Property Rows from JSON in Spark on Microsoft Fabric

Per-Property Rows from JSON in Spark on Microsoft Fabric

Ian Griffiths

Spark doesn't always interpret JSON how we'd like. For example, if each key/value pair in a JSON object is conceptually one item, Spark won't give you a row per item by default. This article shows how to nudge Spark in the right direction.
.NET JsonElement and Schema Validation

.NET JsonElement and Schema Validation

Ian Griffiths

Corvus.JsonSchema enables safe use of the very high performance JSON parsing offered by .NET's System.Text.Json.
.NET JsonElement Error Handling

.NET JsonElement Error Handling

Ian Griffiths

.NET's System.Text.Json offers very high performance JSON parsing. However, JsonElement's text parsing methods offer a trap for the unwary
Analyzing WPF performance by enabling ETW

Analyzing WPF performance by enabling ETW

Ian Griffiths

WPF makes extensive performance instrumentation available through ETW. However, in modern .NET, it's not obvious how to get hold of it. This blog shows how
ASP.NET Core 8.0 uses C# 12.0's experimental interceptors to enable AOT

ASP.NET Core 8.0 uses C# 12.0's experimental interceptors to enable AOT

Ian Griffiths

C# 12 includes an experimental 'interceptors' feature. If you use trimming or AOT publishing in ASP.NET Core 8.0, you're already using this.
Boosting string search performance in .NET 8.0 with SearchValues

Boosting string search performance in .NET 8.0 with SearchValues

Ian Griffiths

Learn how .NET 8.0's SearchValues<T> can speed up string searching
How .NET 8.0 boosted AIS.NET performance by 27%

How .NET 8.0 boosted AIS.NET performance by 27%

Ian Griffiths

When we benchmarked endjin's AIS.NET library on .NET 8.0, we were delighted to see substantial performance gains, with no extra work required.
How .NET 7.0 boosted AIS.NET performance by 19%

How .NET 7.0 boosted AIS.NET performance by 19%

Ian Griffiths

When we benchmarked endjin's AIS.NET library on .NET 7.0, we were delighted to see substantial performance gains, with no extra work required.
Rx.NET v6.0 Now Available

Rx.NET v6.0 Now Available

Ian Griffiths

For the first time since 2020, a new release of Rx.NET is available, supporting .NET 6 and .NET 7.
C# 11.0 new features: Span<char> pattern matching

C# 11.0 new features: Span<char> pattern matching

Ian Griffiths

C# 11.0 adds some new pattern matching features. In this post, Ian shows the new support for matching lists.
C# 11.0 new features: list pattern matching

C# 11.0 new features: list pattern matching

Ian Griffiths

C# 11.0 adds some new pattern matching features. In this post, Ian shows the new support for matching lists.
C# 11.0 new features: newlines in string interpolation expressions

C# 11.0 new features: newlines in string interpolation expressions

Ian Griffiths

C# 11.0 enhances string literals with new features. Discover how multiline interpolated strings boost readability in Ian's insightful post.
C# 11.0 new features: UTF-8 string literals

C# 11.0 new features: UTF-8 string literals

Ian Griffiths

C# 11.0 adds various improvements to string literals. In this post, Ian explains how we can now create UTF-8 string literals.
C# 11.0 new features: raw string literals

C# 11.0 new features: raw string literals

Ian Griffiths

C# 11.0 adds various improvements to string literals. In this post, Ian explains how raw string literals can make your code more readable.
Lazy and once-only C# async initialization

Lazy and once-only C# async initialization

Ian Griffiths

Performing lazy and/or just-once initialization is a simple optimization. But what if the initialization is async?
In Defence of Squash Commits

In Defence of Squash Commits

Ian Griffiths

Encapsulation is a powerful tool. Squash commits provide a way to encapsulate Git commit history.
C# Lambda Discards

C# Lambda Discards

Ian Griffiths

C# has gradually been adding support for discards. This article explores how this evolution has led to some surprises.
Excel, data loss, IEEE754, and precision

Excel, data loss, IEEE754, and precision

Ian Griffiths

Explore the impact of Excel's numeric precision rules on identifiers and learn about infamous data loss incidents caused by misuse in this post.
C# 11.0 preview: parameter null checking

C# 11.0 preview: parameter null checking

Ian Griffiths

Discover C# 11.0's new !! syntax for detecting & rejecting null arguments. Learn its true purpose and clear up common misconceptions in this post.
C# 10.0 improves handling of nullable references in generic types - no more AllowNull

C# 10.0 improves handling of nullable references in generic types - no more AllowNull

Ian Griffiths

Explore C# 10.0's improved nullability annotations in generic code, replacing AllowNull with more intuitive syntax.
Raising Coding Standards with .NET 6.0 Code Analyzers

Raising Coding Standards with .NET 6.0 Code Analyzers

Ian Griffiths

.NET 6.0 makes it easier to take full advantage of code analyzers that can help you improve the quality of your code.
How .NET 6.0 boosted Ais.Net performance by 20%

How .NET 6.0 boosted Ais.Net performance by 20%

Ian Griffiths

When we tested endjin's AIS.NET library on .NET 6.0, we were delighted to see substantial performance gains, with no extra work required.
How C# 10.0 and .NET 6.0 improve ArgumentExceptions

How C# 10.0 and .NET 6.0 improve ArgumentExceptions

Ian Griffiths

C# 10.0's support for CallerArgumentExpression and some new helpers in .NET 6.0 make throwing argument exceptions more succinct and less error prone.
C# 10.0 implicit global using directives

C# 10.0 implicit global using directives

Ian Griffiths

C# 10's new implicit global imports can make your code more communicative. This article shows how the magic works, and how you can control the feature.
How Azure Synapse unifies your development experience

How Azure Synapse unifies your development experience

Ian Griffiths

Modern analytics requires a multi-faceted approach, which can cause integration headaches. Azure Synapse's Swiss army knife approach can remove a lot of friction.
When C# 9.0 patterns go wrong: mechanism over intent

When C# 9.0 patterns go wrong: mechanism over intent

Ian Griffiths

C# 9 enhances pattern matching capabilities. Ian Griffiths advises caution to avoid complexity.
C# 8.0 nullable references: defeating the point with empty strings

C# 8.0 nullable references: defeating the point with empty strings

Ian Griffiths

Enabling C# 8's nullable references feature often produces a lot of warnings. Avoid the temptation to make some go away by initializing properties to empty strings.
C# 8.0 nullable references: prepare today by not misusing 'as'

C# 8.0 nullable references: prepare today by not misusing 'as'

Ian Griffiths

Prepare for using C# 8.0 nullable references by not misusing the 'as' operator.
ArrayPool vs MemoryPool—minimizing allocations in AIS.NET

ArrayPool vs MemoryPool—minimizing allocations in AIS.NET

Ian Griffiths

Tracking down unexpected allocations in a high-performance .NET parsing library.
C# 8.0 nullable references and serialization

C# 8.0 nullable references and serialization

Ian Griffiths

C# 8's nullable references feature can clash with common serialization techniques. This article shows how to deal with that.
C# 8.0 nullable references: when methods don't return

C# 8.0 nullable references: when methods don't return

Ian Griffiths

Explore the importance of DoesNotReturn & DoesNotReturnIf attributes in C# 8 nullable references, enhancing their long-standing role in C#.

Reactive Extensions for .NET at dotnetsheff

Ian Griffiths

Ian Griffiths is talking about the Reactive Extensions for .NET at dotnetsheff. Learn the ideas behind Rx, and see it applied in an IoT applicable to upload clinical monitoring data to the cloud.
C# 8.0 nullable references: supporting older runtimes

C# 8.0 nullable references: supporting older runtimes

Ian Griffiths

See how to use C# 8.0 nullable references even when targetting older versions of .NET that don't officially support it.
C# 8.0 nullable references: more type system transcendence with DisallowNull

C# 8.0 nullable references: more type system transcendence with DisallowNull

Ian Griffiths

C# 8.0 nullable references help identify potential null-related bugs. DisallowNull attribute enhances properties and generics.
C# 8.0 nullable references: conditional post-conditions

C# 8.0 nullable references: conditional post-conditions

Ian Griffiths

Explore C#8's NotNullWhen, MaybeNullWhen, & NotNullIfNotNull attributes for improved nullability warnings, aiding method output inference from inputs.
C# 8.0 nullable references: MaybeNull

C# 8.0 nullable references: MaybeNull

Ian Griffiths

The MaybeNull attribute enables C#8's nullable references feature to provide more useful warnings, by helping it infer information about a method output.
C# 8.0 nullable references: NotNull

C# 8.0 nullable references: NotNull

Ian Griffiths

The NotNull attribute enables C#8's nullable references feature to provide more useful warnings, by helping it infer information about a method argument.
C# 8.0 nullable references: transcending the type system with AllowNull

C# 8.0 nullable references: transcending the type system with AllowNull

Ian Griffiths

Explore C# 8.0 nullable references & AllowNull attribute for better null-related bug detection and enhanced expressiveness in properties & generics.
C# 8.0 nullable references: get better results with nullability attributes

C# 8.0 nullable references: get better results with nullability attributes

Ian Griffiths

C# 8.0 nullable references enable us to annotate our code with information that lets the compiler discover possible null-related bugs.
C# 8.0 nullable references: getting started in an existing codebase

C# 8.0 nullable references: getting started in an existing codebase

Ian Griffiths

C# 8.0's nullable references feature dramatically changes a fundamental aspect of the language. In this post, Ian explains how to you can soften the impact by enabling gradually across your projects.
C# 8.0 nullable references: inferred (non-)nullness

C# 8.0 nullable references: inferred (non-)nullness

Ian Griffiths

Ian discusses inferred nullness and its significance in C# 8.0's new Nullable References feature.
C# 8.0 nullable references: embrace the expressiveness

C# 8.0 nullable references: embrace the expressiveness

Ian Griffiths

C# 8.0 nullable references detect null-related errors and enhance code expressiveness.
C# 8.0 nullable references: non-nullable is the new default

C# 8.0 nullable references: non-nullable is the new default

Ian Griffiths

Explore C# 8.0's nullable references feature, as Ian discusses its impact on default nullability assumptions in this informative post.
C# teamwork: share project config with common Nuget Build Asset Packages

C# teamwork: share project config with common Nuget Build Asset Packages

Ian Griffiths

See how to manage consistent default configuration across all your .NET projects by using NuGet build assets.
High-performance C#: a test pattern for ref structs

High-performance C#: a test pattern for ref structs

Ian Griffiths

Explore C# 7.2's ref structs, use in high-performance scenarios, their constraints, and techniques for overcoming challenges in unit testing the Ais.Net parser.
Introducing Ais.Net - High-Performance Parsing in C#

Introducing Ais.Net - High-Performance Parsing in C#

Ian Griffiths

Explore endjin's high-performance .NET AIS parser, developed for OceanMind, used for tracking commercial ships.
Why You Should Buy My Book: Programming C# 8.0

Why You Should Buy My Book: Programming C# 8.0

Ian Griffiths

Ian spent a big chunk of last year writing an update to his book, Programming C# 8.0. Books continue to be Ian's preferred source of learning because nothing else offers the combination of depth, breadth, and coherence. His goal with Programming C# 8.0 (and its predecessors) was very clear: to write the book that he would want to read if he were learning C# today. It is Ian's attempt to distil around 18 years of experience with C# (part of almost 30 years of work as a programmer) into a coherent, complete description of what you'll need to know to be productive today in C#.
NDC London Day 1

NDC London Day 1

Ian Griffiths

In this post, Ian describes some of the highlights from the NDC London conference
AI for Good Hackathon

AI for Good Hackathon

Ian Griffiths

Endjin attended Microsoft's AI for Good hackathon at the IET in London, highlighting the potential of tech to amplify good deeds.
C# 8 Positional Patterns Custom Deconstructor Pitfall

C# 8 Positional Patterns Custom Deconstructor Pitfall

Ian Griffiths

Discover 'positional patterns' in C# 8, their interaction with custom desconstructors, and unexpected behaviors.
C#, Span and async

C#, Span and async

Ian Griffiths

Explore how ref struct types like Span<T> in C# enhance performance but pose async method challenges, and learn mitigation techniques.
C# faux amis 3: variable declarations and type patterns

C# faux amis 3: variable declarations and type patterns

Ian Griffiths

Ian Griffiths discusses C# 8 features, highlighting how 'var' can enhance compile-time type checking in his final series article.
C# faux amis 2: tuple deconstruction and positional patterns

C# faux amis 2: tuple deconstruction and positional patterns

Ian Griffiths

C# v8.0 introduces various new patterns. In this article, part of a series on how the evolution of the language has added complexity, Ian Griffiths shows how the strong resemblance between the new Positional Patterns and Deconstruction can be misleading.
C# faux amis 1: discards and underscores

C# faux amis 1: discards and underscores

Ian Griffiths

Visual Studio 2019 saw the arrival of C# v8.0. This article shows the first of a series of examples of how friction can arise when integrating new features into a mature language: the relatively late addition of 'discards' causes some surprises.
C# 8 surprising patterns

C# 8 surprising patterns

Ian Griffiths

Visual Studio 2019 saw the arrival of C# v8.0. A programming language cannot evolve for 20 years without developing a few quirks. Ian Griffiths writes about a surprising aspect of the new pattern matching features, and what this reveals about how the language has changed.
A conversation about .NET, The Cloud, Data & AI, teaching software engineers and joining endjin with Ian Griffiths

A conversation about .NET, The Cloud, Data & AI, teaching software engineers and joining endjin with Ian Griffiths

Ian Griffiths

When he joined endjin, Technical Fellow Ian sat down with founder Howard for a Q&A session. This was originally published on LinkedIn in 5 parts, but is republished here, in full. Ian talks about his path into computing, some highlights of his career, the evolution of the .NET ecosystem, AI, and the software engineering life.
Async pitfalls: deferred work and resource ownership

Async pitfalls: deferred work and resource ownership

Ian Griffiths

Combining deferred execution with asynchronous operations can cause subtle problems. This post shows how to ensure correct operation when these idioms combine.
Joining endjin as a Technical Fellow

Joining endjin as a Technical Fellow

Ian Griffiths

Ian talks about how excited he is to be joining endjin as a technical fellow, and talks a bit about his career path that led to this point.
What's up with Half.MaxValue in .NET?

What's up with Half.MaxValue in .NET?

Ian Griffiths

C# Source Generators Boost Productivity in the Rx.NET Repo

C# Source Generators Boost Productivity in the Rx.NET Repo

Ian Griffiths

10x Apache Spark performance improvement in Microsoft Fabric

10x Apache Spark performance improvement in Microsoft Fabric

Ian Griffiths

Azure Functions Deep Dive

Azure Functions Deep Dive

Ian Griffiths

The Heart of Reactive Extensions for .NET

The Heart of Reactive Extensions for .NET

Ian Griffiths

Modernizing Reactive Extensions for .NET

Modernizing Reactive Extensions for .NET

Ian Griffiths

High Performance JSON Serialization With Code Generation on C# 11 and .NET 7.0

High Performance JSON Serialization With Code Generation on C# 11 and .NET 7.0

Ian Griffiths

Show & Tell - A Brief Intro to Tensors & GPT with TorchSharp

Show & Tell - A Brief Intro to Tensors & GPT with TorchSharp

Ian Griffiths

Decision Makers Guide to Microsoft Fabric - The Pace of Innovation

Decision Makers Guide to Microsoft Fabric - The Pace of Innovation

Ian Griffiths, Ed Freeman

Decision Makers Guide to Microsoft Fabric - Microsoft Fabric and Generative AI

Decision Makers Guide to Microsoft Fabric - Microsoft Fabric and Generative AI

Ian Griffiths, Ed Freeman

Modernizing Rx.NET

Modernizing Rx.NET

Ian Griffiths

Decision Makers Guide to Microsoft Fabric - Hedging your Fabric Bet

Decision Makers Guide to Microsoft Fabric - Hedging your Fabric Bet

Ian Griffiths, Ed Freeman

Perspectives on Microsoft Fabric

Perspectives on Microsoft Fabric

Barry Smart, Ian Griffiths, Ed Freeman

Building Large-Scale Multi-Tenant SaaS Systems with Azure Cosmos DB

Building Large-Scale Multi-Tenant SaaS Systems with Azure Cosmos DB

Ian Griffiths

An overview of Reaqtor AKA Cloud Native Rx

An overview of Reaqtor AKA Cloud Native Rx

Ian Griffiths

Reaqtor - Reliable Rx at Scale for High-performance Event Processing

Reaqtor - Reliable Rx at Scale for High-performance Event Processing

Carmel Eve, Ian Griffiths

Navigating the Bewildering Array of Data Services in Azure

Navigating the Bewildering Array of Data Services in Azure

Ian Griffiths

Data Exploration & Experimentation with Notebooks in Azure

Data Exploration & Experimentation with Notebooks in Azure

Ian Griffiths

Reactive Extensions for .NET

Reactive Extensions for .NET

Ian Griffiths

Custom C# Spark Jobs in Azure Synapse

Custom C# Spark Jobs in Azure Synapse

Ian Griffiths

Custom Scala Spark Jobs in Azure Synapse

Custom Scala Spark Jobs in Azure Synapse

Ian Griffiths

C# 8.0 Nullable Reference in Practice

C# 8.0 Nullable Reference in Practice

Ian Griffiths