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

相关文章:

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

C# 高阶用法详解&#xff1a;从基础到实战 在实际开发中&#xff0c;C# 提供了很多高级特性和设计模式&#xff0c;帮助我们写出更加简洁、灵活和高效的代码。本篇将深入探讨 C# 中的高阶用法&#xff0c;通过丰富的示例&#xff0c;带你掌握这些工具的精髓。 1. LINQ&#x…...

[数据集][目标检测]乱堆物料检测数据集VOC+YOLO格式1143张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1143 标注数量(xml文件个数)&#xff1a;1143 标注数量(txt文件个数)&#xff1a;1143 标注…...

【SQL】百题计划:SQL对于空值的比较判断。

[SQL]百题计划 方法&#xff1a; 使用 <> (!) 和 IS NULL [Accepted] 想法 有的人也许会非常直观地想到如下解法。 SELECT name FROM customer WHERE referee_Id <> 2;然而&#xff0c;这个查询只会返回一个结果&#xff1a;Zach&#xff0c;尽管事实上有 4 个…...

OJ在线判题系统项目笔记

项目介绍 在线评测编程题目代码的系统&#xff0c;出题人预先设置题目的输入样例和输出样例&#xff0c;根据用户提交代码&#xff0c;进行编译代码&#xff0c;运行代码&#xff0c;判断代码执行结果是否正确。 后端服务 网关服务 接收前端请求&#xff0c;转发到对应的服…...

期望极大算法(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技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…...

移动硬盘读取出错结构损坏?数据恢复实战指南

移动硬盘困境&#xff1a;读取出错与结构损坏 在日常的数据存储与传输中&#xff0c;移动硬盘以其大容量、便携性成为了众多用户的首选。然而&#xff0c;当移动硬盘遭遇读取出错或结构损坏的困境时&#xff0c;那些珍贵的文件、照片、视频等数据便岌岌可危&#xff0c;让人心…...

Web安全之HTTPS调用详解和证书说明案例示范

随着互联网的高速发展&#xff0c;网络安全成为了一个不可忽视的话题&#xff0c;特别是在涉及用户敏感信息的业务系统中。在此背景下&#xff0c;使用HTTPS取代HTTP成为了大势所趋。本文将以电商交易系统为例&#xff0c;详细介绍HTTPS的重要性&#xff0c;并探讨如何通过HTTP…...

man命令学习记录

使用man来查看命令的用法 man ls 想了解Linux命令的用法假设你想查ls命令的更多信息&#xff0c;输入man ls&#xff0c;就会打开man page&#xff08;man是manual的缩写&#xff0c;因此man page就是“手册页面”&#xff09;&#xff0c;显示关于ls命令各个方面的信息。 通常…...

Linux三剑客-grep

grep介绍 全拼&#xff1a; Global search REgular expression and Print out line. 作用&#xff1a; 文本搜索工具&#xff0c;根据用户指定的“模式&#xff08;过滤条件&#xff09;”对目标文本逐行进行匹配检查&#xff0c;打印匹配到的行。 模式&#xff1a; 有正则表达…...

备忘录模式memento

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/memento 允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构&#xff0c; 也不会影响快照中保存的数据。...

5-【JavaWeb】JUnit 单元测试及JUL 日志系统

1. 使用 JUnit 进行单元测试 JUnit 是 Java 中非常流行的单元测试框架&#xff0c;MyBatis 与 JUnit 可以很好地结合&#xff0c;来测试持久层代码的正确性。 1.1 添加 JUnit 依赖 在使用 JUnit 之前&#xff0c;需要在 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 的主要流程&#xff1f; 21.简述 Kubernetes 中 Pod 的重启策略&#xff1f; 20.简述 Kubernetes 创建一个 Pod 的主要流程&#xff1f; Kubernetes 中创建一个 Pod 涉及多个组件之间联动&#xff0c;主要流程如下&#xff1a; &#…...

EmguCV学习笔记 C# 11.1 DnnInvoke类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...

论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击阅读原文观看作者直播讲解回放&#xff01; 作者简介 孙洲浩&#xff0c;哈尔滨工业大学SCIR实验室博士生 概述 尽管大语言模型&#xff08;LLMs&#xff09;展现出了非常强大的能力&#xff0c;但它们仍然…...

xLSTM模型学习笔记

笔记来源&#xff1a;bilibili LSTM 回顾 原始的 LSTM 是为了解决 RNN 时序反向传播中梯度消失和爆炸问题而提出的。 其所谓的门控机制&#xff0c;其实就是一种时序上的注意力机制&#xff0c;相当于把不同时间进行"掺和"&#xff0c;是对时序信息的一种选择性控制…...

woocommerce 调用当前product_tag 为标题

要在 WooCommerce 中调用当前产品标签&#xff08;product tag&#xff09;作为标题&#xff0c;你可以使用以下代码。这段代码将获取当前产品标签的名称&#xff0c;并将其显示为标题。 <?php // 获取当前产品标签名称 $current_tag single_term_title(, false);// 检查是…...

音视频开发:基于sdl的pcm播放器

源码 /*** SDL2播放PCM*** 本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图* API&#xff08;Direct3D&#xff0c;OpenGL&#xff09;的封装&#xff0c;使用起来明显简单于直接调用底层* API。* 测试的PCM数据采用采样率44.1k, 采用精度S16SYS, 通道数2** 函数调…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...