DEV Community

Cover image for Expression Bodied Collection Property Initialization Gotcha in C#
Sung M. Kim
Sung M. Kim

Posted on • Originally published at slightedgecoder.com on

Expression Bodied Collection Property Initialization Gotcha in C#

This is a post from 2017 but as I was re-learning Trie I read it over and made it available here 🙂

I was implementing a trie, which is a tree data structure, usually for storing strings for searching. Since it’s a tree, it has a “Children” for holding child nodes.

But then I ran into a problem where simply calls to adding children to a collection (Line# 9) didn’t work.

After 30 minutes of debugging, I was like…

cat banging head on the table

Just what the h**l happened?

TL;DR

Auto Property initialization creates a backing field while Expression Bodied property one does not

â–¬ Introduction â–¬

According to Wikpedia, you can declare a trie like this (in Haskell).

So I created a TrieNode class as shown below.

*If you are an astute reader, you might have already spotted the problem. Congratulations!*

â–¬ Problem â–¬

The complete source for building a trie, TrieBuilder is declared as below.

Given a list of words passed to BuildTrie method, it populates a trie and returns an object instance.

Insert method simply checks for an existence of a character and maps current character to a node to the trie object instance , current.

This is where the problem occurred. current.Children.Add(...) wasn’t adding node object instance.

â–¬ Investigation â–¬

Later on, I found out a StackOverflow answer explanating that declaring a property with => syntax (introduced in C# 6) does NOT create a backing field.

So my declaration below,

is equivalent to

returning a new array whenever Children property was accessed, thus not adding a new node to it.

â–¬ Solution â–¬

The fix is simple. Declare Children with a backing field or use an auto property initialization syntax.

Above declaration is equivalent to

That was all it took to make me a happy camper ?.

a happy camper

â–¬ Takeaway â–¬

Auto Property initialization creates a backing field while Expression Bodied property one does not.

The post Expression Bodied Collection Property Initialization Gotcha in C# appeared first on Slight Edge Coder.

Latest comments (0)