在实际开发中,C# 提供了很多高级特性和设计模式,帮助我们写出更加简洁、灵活和高效的代码。本篇将深入探讨 C# 中的高阶用法,通过丰富的示例,带你掌握这些工具的精髓。
LINQ 提供了强大的查询功能,下面是一些进阶的应用场景。
// 示例1:结合复杂的过滤与投影
var students = new List<Student>
{
new Student { Name = "Alice", Age = 20, Grade = 85 },
new Student { Name = "Bob", Age = 22, Grade = 70 },
new Student { Name = "Cathy", Age = 21, Grade = 95 }
};
var filteredStudents = students
.Where(s => s.Age > 20 && s.Grade > 80)
.Select(s => new { s.Name, Status = s.Grade > 90 ? "优秀" : "良好" });
foreach (var student in filteredStudents)
{
Console.WriteLine($"Name: {student.Name}, Status: {student.Status}");
}
要点:LINQ 中的
Where
和Select
操作可以结合条件和投影,处理复杂的业务逻辑。
委托和事件是 C# 中实现回调函数和事件驱动机制的重要方式。
// 委托定义
public delegate void Notify(string message);
public class Process
{
public event Notify ProcessCompleted; // 事件声明
public void StartProcess()
{
Console.WriteLine("Processing...");
// 模拟一些处理
System.Threading.Thread.Sleep(2000);
// 触发事件
OnProcessCompleted("Process is complete!");
}
protected virtual void OnProcessCompleted(string message)
{
ProcessCompleted?.Invoke(message); // 触发事件
}
}
class Program
{
static void Main(string[] args)
{
Process process = new Process();
process.ProcessCompleted += Message => Console.WriteLine(Message); // 订阅事件
process.StartProcess();
}
}
要点:委托与事件使得代码更具可扩展性,便于模块化和事件驱动开发。
表达式树是一种用于表示代码逻辑的结构,常用于动态 LINQ、ORM 框架中。
using System;
using System.Linq.Expressions;
class Program
{
static void Main(string[] args)
{
// 构建表达式树
Expression<Func<int, int, int>> expression = (a, b) => a + b;
// 编译并执行
var func = expression.Compile();
int result = func(3, 4);
Console.WriteLine($"Result: {result}");
}
}
要点:表达式树可用于动态生成代码或将逻辑表达为可查询的数据结构,适用于元编程和动态计算。
异步编程是 C# 的重要特性,用于提升程序的并发性能。
public async Task<string> DownloadDataAsync(string url)
{
using (HttpClient client = new HttpClient())
{
// 异步获取数据
var data = await client.GetStringAsync(url);
return data;
}
}
public async Task MainAsync()
{
var url = "https://example.com";
var result = await DownloadDataAsync(url);
Console.WriteLine(result);
}
要点:
async/await
用于编写异步代码,避免阻塞线程,提高并发性能。搭配HttpClient
等异步 API 使用非常高效。
特性允许我们向代码中添加元数据,在运行时通过反射来读取和处理这些信息。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorAttribute : Attribute
{
public string Name { get; }
public AuthorAttribute(string name)
{
Name = name;
}
}
[Author("John Doe")]
public class SampleClass
{
[Author("Jane Doe")]
public void SampleMethod() { }
}
class Program
{
static void Main(string[] args)
{
// 读取类上的特性
var classAttributes = typeof(SampleClass).GetCustomAttributes(typeof(AuthorAttribute), false);
foreach (AuthorAttribute attr in classAttributes)
{
Console.WriteLine($"Class Author: {attr.Name}");
}
// 读取方法上的特性
var methodAttributes = typeof(SampleClass).GetMethod("SampleMethod").GetCustomAttributes(typeof(AuthorAttribute), false);
foreach (AuthorAttribute attr in methodAttributes)
{
Console.WriteLine($"Method Author: {attr.Name}");
}
}
}
要点:自定义特性可以用于控制器、实体、服务等各种场景,便于在运行时做出动态行为调整。
C# 7 引入了值元组,使我们可以返回多个值并提高代码的可读性。
public (string Name, int Age) GetPersonInfo()
{
return ("Alice", 30);
}
class Program
{
static void Main(string[] args)
{
var person = GetPersonInfo();
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
}
}
要点:值元组比返回类对象更轻量,适合用于快速返回多个值而不需要专门定义类。
C# 7 开始支持模式匹配,可以使条件判断更加灵活。
public void PrintType(object obj)
{
switch (obj)
{
case int i:
Console.WriteLine($"Integer: {i}");
break;
case string s:
Console.WriteLine($"String: {s}");
break;
case null:
Console.WriteLine("Object is null");
break;
default:
Console.WriteLine("Unknown type");
break;
}
}
class Program
{
static void Main(string[] args)
{
PrintType(42);
PrintType("Hello");
PrintType(null);
}
}
要点:模式匹配可大大简化类型判断逻辑,尤其在处理复杂数据结构时非常有用。
C# 的高级功能为开发者提供了编写高效、简洁代码的工具。掌握这些特性,你将能够应对更多复杂的开发需求,提升代码质量。