Master advanced C# features and .NET Core specific programming patterns.
Master advanced C# features and .NET Core specific programming patterns.
Explore the latest C# features that make .NET Core development more efficient and expressive
Content by: Vaibhav Nakrani
.Net Developer
// Nullable reference types
string? nullableString = null;
string nonNullableString = "Hello";
// Pattern matching enhancements
public static string GetDisplayText(object obj) => obj switch
{
string s when s.Length > 10 => s.Substring(0, 10) + "...",
string s => s,
int i => i.ToString(),
DateTime dt => dt.ToString("yyyy-MM-dd"),
_ => "Unknown"
};
// Using declarations
public void ProcessFile(string path)
{
using var file = File.OpenRead(path);
// File is automatically disposed at end of scope
}
// Static local functions
public void Calculate()
{
static int Add(int a, int b) => a + b;
var result = Add(5, 3);
}
// Records
public record Person(string FirstName, string LastName, int Age);
// Init-only properties
public class Product
{
public string Name { get; init; }
public decimal Price { get; init; }
}
// Pattern matching improvements
public static bool IsValidEmail(string email) => email is not null and not "" and contains "@";
// Target-typed new expressions
List<string> names = new() { "Alice", "Bob", "Charlie" };
Dictionary<string, int> ages = new() { ["Alice"] = 30, ["Bob"] = 25 };
Test your understanding of this topic:
Master asynchronous programming patterns in .NET Core for better performance and responsiveness
Content by: Dipen Dalvadi
.Net Developer
// Basic async method
public async Task<string> GetDataAsync()
{
using var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync("https://api.example.com/data");
return response;
}
// Async with cancellation
public async Task<string> GetDataWithCancellationAsync(CancellationToken cancellationToken)
{
using var httpClient = new HttpClient();
var response = await httpClient.GetStringAsync("https://api.example.com/data", cancellationToken);
return response;
}
// ConfigureAwait for library code
public async Task<string> LibraryMethodAsync()
{
var result = await SomeAsyncOperation().ConfigureAwait(false);
return result;
}
// Task.WhenAll for parallel execution
public async Task<(string, string)> GetMultipleDataAsync()
{
var task1 = GetDataAsync("url1");
var task2 = GetDataAsync("url2");
var results = await Task.WhenAll(task1, task2);
return (results[0], results[1]);
}
// Task.WhenAny for first completion
public async Task<string> GetFirstAvailableDataAsync()
{
var tasks = new[]
{
GetDataAsync("primary-url"),
GetDataAsync("backup-url1"),
GetDataAsync("backup-url2")
};
var completedTask = await Task.WhenAny(tasks);
return await completedTask;
}
// Async streams (IAsyncEnumerable)
public async IAsyncEnumerable<string> ReadLinesAsync(string filePath)
{
using var reader = new StreamReader(filePath);
string? line;
while ((line = await reader.ReadLineAsync()) != null)
{
yield return line;
}
}
Test your understanding of this topic:
Learn .NET Core's memory management and performance optimization techniques
Content by: Sunny Radadiya
.Net Developer
// Span<T> for stack-allocated memory
public static int SumSpan(Span<int> numbers)
{
int sum = 0;
foreach (var number in numbers)
{
sum += number;
}
return sum;
}
// Memory<T> for heap-allocated memory
public static async Task ProcessMemoryAsync(Memory<byte> data)
{
// Process data without copying
for (int i = 0; i < data.Length; i++)
{
data.Span[i] = (byte)(data.Span[i] ^ 0xFF);
}
}
// Usage examples
var array = new int[] { 1, 2, 3, 4, 5 };
var span = array.AsSpan();
var sum = SumSpan(span);
// String processing with Span<char>
public static ReadOnlySpan<char> GetSubstring(ReadOnlySpan<char> text, int start, int length)
{
return text.Slice(start, length);
}
Test your understanding of this topic:
Continue your learning journey and master the next set of concepts.
Continue to Module 3