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…
Just what the h**l happened?
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 ,
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 ?.
▬ Takeaway ▬
Auto Property initialization creates a backing field while Expression Bodied property one does not.