当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/435385.html

相关文章:

  • [数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
  • 【SQL】百题计划:SQL对于空值的比较判断。
  • OJ在线判题系统项目笔记
  • 期望极大算法(Expectation Maximization Algorithm,EM)
  • 初级练习[4]:多表查询——表联结
  • 基于JAVA+SpringBoot+Vue的中药实验管理系统
  • 移动硬盘读取出错结构损坏?数据恢复实战指南
  • Web安全之HTTPS调用详解和证书说明案例示范
  • man命令学习记录
  • Linux三剑客-grep
  • 备忘录模式memento
  • 5-【JavaWeb】JUnit 单元测试及JUL 日志系统
  • 多人开发小程序设置体验版的痛点
  • 【Kubernetes】常见面试题汇总(七)
  • EmguCV学习笔记 C# 11.1 DnnInvoke类
  • 论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...
  • xLSTM模型学习笔记
  • woocommerce 调用当前product_tag 为标题
  • 音视频开发:基于sdl的pcm播放器
  • [产品管理-6]:NPDP新产品开发 - 4 - 战略 - 创新支持战略,支持组织的总体创新战略(平台战略、技术战略、营销战略、知识产权战略、能力建设战略)
  • Cursor:程序员的AI助手,开启智能编程新时代
  • OpenAI 刚刚发布了新的Sora视频——实现的真人效果令人惊叹
  • 计算机视觉学习路线
  • JNPF快速开发平台在企业中的应用
  • Mysql高级篇(中)—— 索引优化
  • electron: 将网址打包成exe桌面应用
  • 【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
  • 2024/9/10 小型PLC典型应用1:含步进电机+变频器+触摸屏
  • RGB与CMYK互转
  • 滴~“TOP期刊体验卡”已到期!公认水刊的尽头,还得是你MDPI