Raw string literals in C# provide a flexible way to work with multiline strings, with some interesting rules around how quotes work.
The key insight is that you can use any number of double quotes (three or more) to delimit your string, as long as the opening and closing sequences have the same number of quotes.
"""
// Three quotes - most common usage string basic = """ This is a basic multiline string """; // Four quotes - when your content has three quotes string withThreeQuotes = """" Here's some text with """quoted""" content """"; // Five quotes - when your content has four quotes string withFourQuotes = """"" Here's text with """"nested"""" quotes """""; // Six quotes - for even more complex scenarios string withFiveQuotes = """""" Look at these """""nested""""" quotes! """""";
The general rule is that if your string content contains N consecutive double quotes, you need to wrap the entire string with at least N+1 quotes. This ensures the compiler can properly distinguish between your content and the string's delimiters.
// Example demonstrating the N+1 rule string example1 = """ No quotes inside """; // 3 quotes is fine string example2 = """" Contains """three quotes""" """"; // Needs 4 quotes (3+1) string example3 = """"" Has """"four quotes"""" """""; // Needs 5 quotes (4+1)
// Indentation example string properlyIndented = """ { "property": "value", "nested": { "deeper": "content" } } """; // This line's position determines the indentation
This flexibility with quote counts makes raw string literals extremely versatile, especially when dealing with content that itself contains quotes, like JSON, XML, or other structured text formats.
Reading a file line by line is useful when handling large files without loading everything into memory at once.
✅ Best Practice: Use File.ReadLines() which is more memory efficient.
Example
foreach (string line in File.ReadLines("file.txt")) { Console.WriteLine(line); }
Why use ReadLines()?
Reads one line at a time, reducing overall memory usage. Ideal for large files (e.g., logs, CSVs).
Alternative: Use StreamReader (More Control)
For scenarios where you need custom processing while reading the contents of the file:
using (StreamReader reader = new StreamReader("file.txt")) { string? line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } }
Why use StreamReader?
Lets you handle exceptions, encoding, and buffering. Supports custom processing (e.g., search for a keyword while reading).
When to Use ReadAllLines()? If you need all lines at once, use:
string[] lines = File.ReadAllLines("file.txt");
Caution: Loads the entire file into memory—avoid for large files!
When working with URLs in C#, encoding is essential to ensure that special characters (like spaces, ?, &, and =) don’t break the URL structure. The recommended way to encode a string for a URL is by using Uri.EscapeDataString(), which converts unsafe characters into their percent-encoded equivalents.
string rawText = "hello world!"; string encodedText = Uri.EscapeDataString(rawText); Console.WriteLine(encodedText); // Output: hello%20world%21
This method encodes spaces as %20, making it ideal for query parameters.
For ASP.NET applications, you can also use HttpUtility.UrlEncode() (from System.Web), which encodes spaces as +:
using System.Web; string encodedText = HttpUtility.UrlEncode("hello world!"); Console.WriteLine(encodedText); // Output: hello+world%21
For .NET Core and later, Uri.EscapeDataString() is the preferred choice.
XML (Extensible Markup Language) is a widely used format for storing and transporting data.
In C#, you can create XML files efficiently using the XmlWriter and XDocument classes. This guide covers both methods with practical examples.
XmlWriter
XDocument
XmlWriter provides a fast and memory-efficient way to generate XML files by writing elements sequentially.
using System; using System.Xml; class Program { static void Main() { using (XmlWriter writer = XmlWriter.Create("person.xml")) { writer.WriteStartDocument(); writer.WriteStartElement("Person"); writer.WriteElementString("FirstName", "John"); writer.WriteElementString("LastName", "Doe"); writer.WriteElementString("Age", "30"); writer.WriteEndElement(); writer.WriteEndDocument(); } Console.WriteLine("XML file created successfully."); } }
Output (person.xml):
person.xml
<?xml version="1.0" encoding="utf-8"?> <Person> <FirstName>John</FirstName> <LastName>Doe</LastName> <Age>30</Age> </Person>
The XDocument class from LINQ to XML provides a more readable and flexible way to create XML files.
using System; using System.Xml.Linq; class Program { static void Main() { XDocument doc = new XDocument( new XElement("Person", new XElement("FirstName", "John"), new XElement("LastName", "Doe"), new XElement("Age", "30") ) ); doc.Save("person.xml"); Console.WriteLine("XML file created successfully."); } }
This approach is ideal for working with complex XML structures and integrating LINQ queries.
Writing XML files in C# is straightforward with XmlWriter and XDocument. Choose the method that best suits your needs for performance, readability, and maintainability.
Register for my free weekly newsletter.