Menu

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!

2
40
2/25/2025

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.

0
42
2/25/2025

Storing passwords as plain text is dangerous. Instead, you should hash them using a strong, slow hashing algorithm like BCrypt, which includes built-in salting and resistance to brute-force attacks.

Step 1: Install BCrypt NuGet Package

Before using BCrypt, install the BCrypt.Net-Next package:

dotnet add package BCrypt.Net-Next

or via NuGet Package Manager:

Install-Package BCrypt.Net-Next

Step 2: Hash a Password

Use BCrypt.HashPassword() to securely hash a password before storing it:

using BCrypt.Net;

string password = "mySecurePassword123";
string hashedPassword = BCrypt.HashPassword(password);

Console.WriteLine(hashedPassword); // Output: $2a$12$...

Step 3: Verify a Password

To check a user's login attempt, use BCrypt.Verify():

bool isMatch = BCrypt.Verify("mySecurePassword123", hashedPassword);
Console.WriteLine(isMatch); // Output: True

Ensuring proper hashing should be at the top of your list when it comes to building authentication systems.

0
16
2/25/2025

String interpolation, introduced in C# 6.0, provides a more readable and concise way to format strings compared to traditional concatenation (+) or string.Format(). Instead of manually inserting variables or placeholders, you can use the $ symbol before a string to directly embed expressions inside brackets.

string name = "Walt";
string job = 'Software Engineer';

string message = $"Hello, my name is {name} and I am a {job}";
Console.WriteLine(message);

This would produce the final output of:

Hello, my name is Walt and I am a Software Engineer

String interpolation can also be chained together into a multiline string (@) for even cleaner more concise results:

string name = "Walt";
string html = $@"
    <div>
        <h1>Welcome, {name}!</h1>
    </div>";
11
28
2/25/2025

Using SqlDataReader asynchronously prevents blocking the main thread, improving performance in web apps and large queries. Here’s how to do it properly.

Use await with ExecuteReaderAsync()

using (SqlConnection conn = new SqlConnection(connectionString))
{
    await conn.OpenAsync();
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn))
    using (SqlDataReader reader = await cmd.ExecuteReaderAsync()) 
    {
        while (await reader.ReadAsync()) 
        {
            Console.WriteLine(reader["Username"]);
        }
    } // ✅ Auto-closes reader
} // ✅ Auto-closes connection

Why use async?

A couple of reasons:

  • Frees up the thread while waiting for the database.
  • Improves scalability in ASP.NET Core and web apps.

⚡ Alternative: ConfigureAwait(false) for ASP.NET

Use ConfigureAwait(false) in library code to avoid deadlocks in UI frameworks like ASP.NET.

using (SqlConnection conn = new SqlConnection(connectionString))
{
    await conn.OpenAsync().ConfigureAwait(false);
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users", conn))
    using (SqlDataReader reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false)) 
    {
        while (await reader.ReadAsync().ConfigureAwait(false)) 
        {
            Console.WriteLine(reader["Username"]);
        }
    }
}
0
7
2/25/2025

Enums are a great way to define a set of named constants in C#, but what if you need to iterate over all values dynamically? You can use** Enum.GetValues()** to loop through an enum without hardcoding values.

enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }

foreach (Days day in Enum.GetValues(typeof(Days)))
{
    Console.WriteLine(day);
}

This would output the following:

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday

Alternative: Using Enum.GetNames() If you only need the string names, use Enum.GetNames() instead:

foreach (string name in Enum.GetNames(typeof(Days)))
{
    Console.WriteLine(name);
}
0
32
2/25/2025