Strings, Interpolation & StringBuilder
Text is everywhere — names, messages, file contents, reports. This lesson goes well beyond basic printing: you'll master string interpolation and formatting, the essential string methods for cleaning and searching text, verbatim strings for paths and multi-line text, and StringBuilder for efficiently building large strings.
Learn Strings, Interpolation & StringBuilder in our free C# course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a…
Part of the free C# course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
An immutable string is like a printed photograph . You can't edit the photo itself — if you want a brighter version, you make a new print; the original stays exactly as it was. That's why name.ToUpper() hands you a new string and leaves name alone. A StringBuilder , by contrast, is the editable digital file on your computer: you tweak it as many times as you like in place, and only "print" (call ToString() ) once you're done.
1. Interpolation & Formatting
Interpolation — the
quot;..." syntax — is the modern way to build text from values. After a colon you can add a format specifier ( :C , :F2 , :P0 ) and after a comma an alignment width for neat columns. It's far more readable than gluing strings together with + .2. The Essential String Methods
Strings come with a rich toolkit. Trim removes surrounding whitespace, ToUpper / ToLower change case, Replace swaps text, Contains / IndexOf search, and Substring extracts a slice. Split turns text into an array and string.Join glues an array back into text. Remember: every one of these returns a new string — the original never changes.
Your turn. Clean up a messy name and reformat it to proper case. The trickier capitalisation lines are written for you — fill in the Trim blank.
3. StringBuilder for Heavy Lifting
Because strings are immutable, building one with += inside a loop secretly creates a fresh string every iteration — quadratic work that crawls for large inputs. StringBuilder keeps one growable buffer and mutates it with Append and AppendLine , materialising the final string only when you call ToString() . Reach for it whenever you build text in a loop.
A verbatim string @"..." treats backslashes literally — perfect for Windows paths and regex patterns — and lets the text span multiple lines exactly as typed. Prefix with both $@ (or @$ ) to get interpolation and verbatim behaviour together.
Newer C# (11+) also offers raw string literals with triple quotes , which handle embedded quotes and indentation cleanly — great for JSON or HTML blocks. Verbatim strings remain the workhorse you'll see most often.
These six lines build a comma-separated list with a StringBuilder and print red, green, blue . Put them in working order.
Why: colours must exist before the loop iterates it, and the StringBuilder must exist before Append is called. The loop fills the buffer, then we trim the trailing ", " into result , and print it last. (The stray sb.ToString() line was a distractor — the real final string is result .)
Hello — strings are immutable, so ToUpper() returns a new string that's thrown away. You'd need s = s.ToUpper(); to keep it.
3 — Split('-') breaks the text into ["a", "b", "c"] , an array of length 3.
" 42" — the ,5 right-aligns 42 in a 5-character field, padding with three spaces.
Use a StringBuilder to assemble a multi-line invoice, formatting each price as currency and summing a total. The outline is in the comments.
Practice quiz
Why are C# strings immutable?
- They can be changed in place
- They are always empty
- Once created, their characters never change; methods return new strings
- They store numbers only
Answer: Once created, their characters never change; methods return new strings. Immutable means a string's contents never change; methods like ToUpper return a brand-new string.
What does s.ToUpper() do if you don't assign its result back to s?
- Returns a new string that is discarded, leaving s unchanged
- Changes s in place
- Throws an error
- Empties s
Answer: Returns a new string that is discarded, leaving s unchanged. Strings are immutable, so ToUpper returns a new string; without s = s.ToUpper(); the original is unchanged.
What is the length of the array from "a-b-c".Split('-') ?
- 1
- 2
- 4
- 3
Answer: 3. Split('-') breaks the text into ["a", "b", "c"], an array of length 3.
Which class is best for building a large string in a loop?
- String
- StringBuilder
- List
- Array
Answer: StringBuilder. StringBuilder mutates one internal buffer (O(n)), avoiding the quadratic cost of += in a loop.
What does string.Join(" | ", parts) do?
- Glues array elements together with a separator
- Splits text into parts
- Trims whitespace
- Reverses the string
Answer: Glues array elements together with a separator. Join combines the elements of an array into one string, separated by the given text.
What does a verbatim string @"C:\Reports" treat backslashes as?
- Escape characters
- New lines
- Literal characters
- Errors
Answer: Literal characters. In a @"..." verbatim string, backslashes are literal — no escaping needed, ideal for file paths.
Which method removes whitespace from both ends of a string?
- Replace
- Trim
- Substring
- Split
Answer: Trim. Trim() returns a new string with surrounding whitespace removed.
What does "Yes" == "yes" evaluate to?
- true
- an error
- null
- false
Answer: false. String comparison with == is case-sensitive by default, so "Yes" and "yes" are not equal.
What does the alignment in
quot;{42,5}" produce?- "42 "
- " 42"
- "42"
- "00042"
Answer: " 42". A positive width right-aligns the value in a field of that width, padding the left with spaces: " 42".
When is StringBuilder unnecessary?
- When looping thousands of times
- Never use plain strings
- For just a couple of joins
- Only with numbers
Answer: For just a couple of joins. For a handful of concatenations, plain + or interpolation is fine and more readable; reach for StringBuilder in loops.