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 Microsoft MVP in Developer Technologies. He is the author of O'Reilly's Programming C# 8.0, and has written Pluralsight courses on WPF (and here) and the TPL. Technology brings him joy.

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

The world runs on Excel, and misuse has caused some infamous data loss incidents. This post explores what happens when identifiers fall foul of Excel's numeric precision rules.
C# 11.0 preview: parameter null checking

C# 11.0 preview: parameter null checking

Ian Griffiths

C# 11.0 has a new syntax, !!, which makes it easier to detect and reject null arguments. It is simple, but misunderstood. This post explains what it really does, and how it has been misinterpreted.
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

C# 10.0 lets us annotate the nullability aspects of generic code more naturally than older versions. Some places where the AllowNull attribute was once required can now just use the obvious nullability 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 makes welcome additions to the language's increasingly powerful pattern matching capabilities. However, with great power comes a temptation to make a great big mess. In this post, Ian Griffiths urges us not to get carried away.
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

The DoesNotReturn and DoesNotReturnIf attributes have been around for a long time in C#, but they take on additional significance when using C# 8 nullable references.

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 enable us to annotate our code with information that lets the compiler discover possible null-related bugs. The DisallowNull attribute lets us get more expressive with properties and generics.
C# 8.0 nullable references: conditional post-conditions

C# 8.0 nullable references: conditional post-conditions

Ian Griffiths

The NotNullWhen MaybeNullWhen, and NotNullIfNotNull attributes enable C#8 provide better nullability warnings, by helping it infer information about a method output based on other 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

C# 8.0 nullable references enable us to annotate our code with information that lets the compiler discover possible null-related bugs. The AllowNull attribute lets us get more expressive with properties and 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

C# 8.0 has two related but distinct notions of nullability. In this article, Ian explains why inferred nullness is a vitally important part of the language'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 offer benefits besides the obvious win of detecting null-related coding errors. This new language feature can also improve the expressiveness of your code.
C# 8.0 nullable references: non-nullable is the new default

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

Ian Griffiths

C# 8.0 has an ambitious new feature, called nullable references. In this post, Ian explains why this makes a fundamental change to the default assumptions about nullability.
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

C# 7.2 introduce ref structs, a new kind of type (Span<T> is a ref struct) designed to support certain high performance scenarios. There are constraints around their use, and when writing unit tests for our Ais.Net parser, this caused some challenges. This blog describes the technique we used to work around the constraints.
Introducing Ais.Net - High-Performance Parsing in C#

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

Ian Griffiths

As part of our work with OceanMind, endjin wrote a high performance .NET AIS parser. AIS (Automatic Identification System) is how commercial ships report location information. This blog describes the parser, and the performance techniques it uses.
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

Towards the end of last year, Microsoft invited endjin along to a hackathon session they hosted at the IET in London as part of their AI for Good initiative. I've been thinking about the event and the broader work Microsoft is doing here a lot lately, because it gets to the heart of what I love about working in this industry: computers can magnify our power to do to good.
C# 8 Positional Patterns Custom Deconstructor Pitfall

C# 8 Positional Patterns Custom Deconstructor Pitfall

Ian Griffiths

The 'positional patterns' added in C# 8 support types with custom desconstructors. However, the way this works might always be quite what you would expect. This article shows a surprising behaviour, and explains how it arises.
C#, Span and async

C#, Span and async

Ian Griffiths

The addition of ref struct types, most notably Span<T>, opened C# to a range of high performance scenarios that were impractical to tackle with earlier versions of the language. However, they introduce some challenges. For example, they do not mix very well with async methods. This article shows some techniques for mitigating this.
C# faux amis 3: variable declarations and type patterns

C# faux amis 3: variable declarations and type patterns

Ian Griffiths

In this, the final article in a series on the potentially deceptive nature of some new features in C# 8, Ian Griffiths shows how using var can sometimes result in better compile-time type checking than using an explicit type. He reflects on the evolution of C#, and what we can learn from this.
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.