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 中的
Where和Select操作可以结合条件和投影,处理复杂的业务逻辑。
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# 的高级功能为开发者提供了编写高效、简洁代码的工具。掌握这些特性,你将能够应对更多复杂的开发需求,提升代码质量。
相关文章:
7个 C# 高阶用法详解:从基础到实战
C# 高阶用法详解:从基础到实战 在实际开发中,C# 提供了很多高级特性和设计模式,帮助我们写出更加简洁、灵活和高效的代码。本篇将深入探讨 C# 中的高阶用法,通过丰富的示例,带你掌握这些工具的精髓。 1. LINQ&#x…...
[数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1143 标注数量(xml文件个数):1143 标注数量(txt文件个数):1143 标注…...
【SQL】百题计划:SQL对于空值的比较判断。
[SQL]百题计划 方法: 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而,这个查询只会返回一个结果:Zach,尽管事实上有 4 个…...
OJ在线判题系统项目笔记
项目介绍 在线评测编程题目代码的系统,出题人预先设置题目的输入样例和输出样例,根据用户提交代码,进行编译代码,运行代码,判断代码执行结果是否正确。 后端服务 网关服务 接收前端请求,转发到对应的服…...
期望极大算法(Expectation Maximization Algorithm,EM)
定义 输入:观测变量数据Y,隐变量数据Z,联合分布P(Y,Z| θ \theta θ),条件分布PP(Z,Y| θ \theta θ); 输出:模型参数 θ \theta θ (1)选择参数的初值 θ ( 0 ) , 开始迭代 ; \theta^{(0)},开始迭代; θ(0),开始迭代; (2)E步:记 θ ( i ) 为第 i 次迭代参数 \theta^{(i)}为第…...
初级练习[4]:多表查询——表联结
目录 多表查询:表联结示例 查询有两门以上的课程不及格的同学的学号及其平均成绩 查询所有学生的学号、姓名、选课数、总成绩 查询平均成绩大于85的所有学生的学号、姓名和平均成绩 查询学生的选课情况:学号,姓名,课程号,课程名称 查询出每门课程的及格人数和不及格人数 …...
基于JAVA+SpringBoot+Vue的中药实验管理系统
基于JAVASpringBootVue的中药实验管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…...
移动硬盘读取出错结构损坏?数据恢复实战指南
移动硬盘困境:读取出错与结构损坏 在日常的数据存储与传输中,移动硬盘以其大容量、便携性成为了众多用户的首选。然而,当移动硬盘遭遇读取出错或结构损坏的困境时,那些珍贵的文件、照片、视频等数据便岌岌可危,让人心…...
Web安全之HTTPS调用详解和证书说明案例示范
随着互联网的高速发展,网络安全成为了一个不可忽视的话题,特别是在涉及用户敏感信息的业务系统中。在此背景下,使用HTTPS取代HTTP成为了大势所趋。本文将以电商交易系统为例,详细介绍HTTPS的重要性,并探讨如何通过HTTP…...
man命令学习记录
使用man来查看命令的用法 man ls 想了解Linux命令的用法假设你想查ls命令的更多信息,输入man ls,就会打开man page(man是manual的缩写,因此man page就是“手册页面”),显示关于ls命令各个方面的信息。 通常…...
Linux三剑客-grep
grep介绍 全拼: Global search REgular expression and Print out line. 作用: 文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行。 模式: 有正则表达…...
备忘录模式memento
学习笔记,原文链接 https://refactoringguru.cn/design-patterns/memento 允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构, 也不会影响快照中保存的数据。...
5-【JavaWeb】JUnit 单元测试及JUL 日志系统
1. 使用 JUnit 进行单元测试 JUnit 是 Java 中非常流行的单元测试框架,MyBatis 与 JUnit 可以很好地结合,来测试持久层代码的正确性。 1.1 添加 JUnit 依赖 在使用 JUnit 之前,需要在 pom.xml 中引入 JUnit 依赖。 <dependency><…...
多人开发小程序设置体验版的痛点
抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…...
【Kubernetes】常见面试题汇总(七)
目录 20.简述 Kubernetes 创建一个 Pod 的主要流程? 21.简述 Kubernetes 中 Pod 的重启策略? 20.简述 Kubernetes 创建一个 Pod 的主要流程? Kubernetes 中创建一个 Pod 涉及多个组件之间联动,主要流程如下: &#…...
EmguCV学习笔记 C# 11.1 DnnInvoke类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...
论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击阅读原文观看作者直播讲解回放! 作者简介 孙洲浩,哈尔滨工业大学SCIR实验室博士生 概述 尽管大语言模型(LLMs)展现出了非常强大的能力,但它们仍然…...
xLSTM模型学习笔记
笔记来源:bilibili LSTM 回顾 原始的 LSTM 是为了解决 RNN 时序反向传播中梯度消失和爆炸问题而提出的。 其所谓的门控机制,其实就是一种时序上的注意力机制,相当于把不同时间进行"掺和",是对时序信息的一种选择性控制…...
woocommerce 调用当前product_tag 为标题
要在 WooCommerce 中调用当前产品标签(product tag)作为标题,你可以使用以下代码。这段代码将获取当前产品标签的名称,并将其显示为标题。 <?php // 获取当前产品标签名称 $current_tag single_term_title(, false);// 检查是…...
音视频开发:基于sdl的pcm播放器
源码 /*** SDL2播放PCM*** 本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图* API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层* API。* 测试的PCM数据采用采样率44.1k, 采用精度S16SYS, 通道数2** 函数调…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
