This leads to 4 memory addresses to be allocated: Tech, io, [EmptyString] , and the Concatenation between tech , [dot] and io

When using the above method for a specific purpose or when you know the number of strings to be concatenated at compile time will be few, then the wasted memory will be negligible, however, this will generate a big issue when in a loop with lots of iterations, where a string is adding (Concatenating) to itself another string or value, it is just constantly reallocating, in other words, it is copying to a new memory location when the memory manager can’t expand the requested amount in place. At this point, the amount of memory required (or wasted) and the processing time used for the creation of the numerous objects may become a bottleneck in the application.

This case is mostly common when, for instance, dynamically generating a TABLE and its content, or building an XML document. With this type of scenario in mind, Microsoft included the StringBuilder class in .NET.

By the way, you might wonder what is the difference between string and String, they both refer to the string type. string, in its small letter form, is only an alias to the String class in C#.