7个 C# 高阶用法详解:从基础到实战

C# 高阶用法详解:从基础到实战

在实际开发中,C# 提供了很多高级特性和设计模式,帮助我们写出更加简洁、灵活和高效的代码。本篇将深入探讨 C# 中的高阶用法,通过丰富的示例,带你掌握这些工具的精髓。

1. LINQ(Language Integrated Query)进阶用法

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 中的 WhereSelect 操作可以结合条件和投影,处理复杂的业务逻辑。

2. 委托和事件

委托和事件是 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();
    }
}

要点:委托与事件使得代码更具可扩展性,便于模块化和事件驱动开发。

3. 表达式树(Expression Trees)

表达式树是一种用于表示代码逻辑的结构,常用于动态 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}");
    }
}

要点:表达式树可用于动态生成代码或将逻辑表达为可查询的数据结构,适用于元编程和动态计算。

4. 异步编程(Async/Await)

异步编程是 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 使用非常高效。

5. 自定义特性(Attributes)

特性允许我们向代码中添加元数据,在运行时通过反射来读取和处理这些信息。

[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}");
        }
    }
}

要点:自定义特性可以用于控制器、实体、服务等各种场景,便于在运行时做出动态行为调整。

6. 值元组(Value Tuples)

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}");
    }
}

要点:值元组比返回类对象更轻量,适合用于快速返回多个值而不需要专门定义类。

7. 模式匹配(Pattern Matching)

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# 的高级功能为开发者提供了编写高效、简洁代码的工具。掌握这些特性,你将能够应对更多复杂的开发需求,提升代码质量。

你可能感兴趣的:(ASP.NET,Core,c#,开发语言)