Practical coding tips, real solutions and career insights for software developers — straight to your inbox. No fluff.
No spam. Unsubscribe anytime. Privacy policy
Thanks for subscribing. First issue lands soon.
File-scoped namespaces, introduced in C# 10, provide a more concise way to declare namespaces in your code files.
This feature helps reduce nesting levels and makes your code cleaner and more readable. Let's explore how to use them effectively and understand their benefits.
Traditionally, C# developers have used block-scoped namespaces, which require curly braces and add an extra level of indentation:
namespace MyCompany.MyProduct.Features { public class UserService { private readonly string _connectionString; public UserService(string connectionString) { _connectionString = connectionString; } public void CreateUser(string username) { // Implementation } } public record User(string Username, string Email); }
With file-scoped namespaces, you can declare the namespace without braces, reducing indentation and making the code more readable:
namespace MyCompany.MyProduct.Features; public class UserService { private readonly string _connectionString; public UserService(string connectionString) { _connectionString = connectionString; } public void CreateUser(string username) { // Implementation } } public record User(string Username, string Email);
Reduced Indentation: File-scoped namespaces eliminate one level of indentation, making the code easier to read and maintain.
Single Namespace per File: File-scoped namespaces enforce a good practice of having only one namespace per file, improving code organization.
Compatibility: File-scoped namespaces work seamlessly with existing code and can be gradually adopted in your codebase.
When using file-scoped namespaces, keep these points in mind:
When converting existing code to use file-scoped namespaces:
File-scoped namespaces are a simple yet effective feature that can make your C# code more readable and maintainable. While the benefits might seem small, they add up significantly in larger codebases. Consider adopting this modern syntax in your C# projects, especially if you're using C# 10 or later.
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>";
Understanding the difference between COUNT() and COUNT(DISTINCT) in SQL is crucial for accurate data analysis.
COUNT() returns the total number of rows that match your query criteria, including duplicates, while COUNT(DISTINCT) returns the number of unique values in a specified column, effectively eliminating duplicates from the count.
For example, if you have a table of customer orders where a single customer can place multiple orders, COUNT(customer_id) would give you the total number of orders, whereas COUNT(DISTINCT customer_id) would tell you how many unique customers have placed orders.
The choice between these functions depends on your specific reporting needs. Use COUNT() when you need the total number of records, such as counting all sales transactions or total number of website visits.
Use COUNT(DISTINCT) when you need to know unique occurrences, like the number of different products sold or unique visitors to your website. It's also worth noting that COUNT(*) counts all rows including NULL values, while COUNT(column_name) excludes NULL values from that specific column, which can lead to different results depending on your data structure.
Example
-- Example table: customer_orders -- customer_id | order_date | product_id -- 1 | 2024-01-01 | 100 -- 1 | 2024-01-02 | 101 -- 2 | 2024-01-01 | 100 -- 3 | 2024-01-03 | 102 -- Count all orders SELECT COUNT(*) as total_orders FROM customer_orders; -- Result: 4 (counts all rows) -- Count unique customers who placed orders SELECT COUNT(DISTINCT customer_id) as unique_customers FROM customer_orders; -- Result: 3 (counts unique customer_ids: 1, 2, 3) -- Count unique products ordered SELECT COUNT(DISTINCT product_id) as unique_products FROM customer_orders; -- Result: 3 (counts unique product_ids: 100, 101, 102) -- Compare regular COUNT with COUNT DISTINCT SELECT COUNT(customer_id) as total_orders, COUNT(DISTINCT customer_id) as unique_customers FROM customer_orders; -- Result: total_orders = 4, unique_customers = 3
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.
Register for my free weekly newsletter.