red
-
C# 如何处理CSV文件 – 开源库CsvHelper入门
推荐使用CsvHelper库处理CSV文件,它轻量高效、支持复杂场景;通过NuGet安装,可自动映射类属性与CSV列名,读写简洁安全,并提供编码、分隔符、头行等灵活配置。 处理 CSV 文件最推荐的方式是使用 CsvHelper —— 一个轻量、高性能、社区活跃的开源库,专为 .NET 设计,能轻松…
-
C# 中的nameof表达式有什么用 – 获取变量、类型或成员的名称
nameof 表达式在编译期获取标识符的字符串名称,零运行时开销,支持智能感知与重命名重构;适用于异常参数、INotifyPropertyChanged、数据注解等场景,但仅支持静态标识符,不支持索引、动态表达式或运行时值。 nameof 表达式用来在编译期获取变量、参数、字段、属性、方法、类型等的…
-
C# ASP.NET Core中的认证与授权 – JWT Bearer入门
在ASP.NET Core中实现JWT认证需配置服务、签发Token并验证签名。1. 在Program.cs中通过AddAuthentication().AddJwtBearer()注册JWT支持,设置密钥、ValidIssuer、ValidAudience等参数;2. 登录成功后构建Claim数组…
-
.NET中的函数式编程实践:告别复杂的面向对象设计
.NET并非仅支持面向对象,C#自3.0起已引入函数式特性。1. 使用record定义不可变类型,如public record Person(string Name, int Age);2. 编写纯函数确保相同输入返回相同输出且无副作用,例如public static bool IsAdult(Pe…
-
C#中的依赖注入(DI)是什么 – ASP.NET Core中的三种生命周期
依赖注入(DI)是 ASP.NET Core 的核心机制,通过 Transient、Scoped、Singleton 三种生命周期管理服务实例:Transient 每次请求新建实例,适合无状态轻量类;Scoped 每请求一个实例,适用于 DbContext 等需上下文绑定的服务;Singleton …
-
C# 如何进行异步文件I/O操作 – ReadAsync和WriteAsync
ReadAsync和WriteAsync需配合FileOptions.Asynchronous创建FileStream才能真正异步,否则退化为同步;推荐复用ArrayPool.Shared缓冲区,File类静态方法适合小文件但不适用于超大文件。 在 C# 中,ReadAsync 和 WriteAsy…
-
C# 进程(Process)类的用法 – 启动和控制外部应用程序
Process类位于System.Diagnostics命名空间,用于启动、控制和交互外部程序;支持直接启动、参数配置、输出重定向、进程监控及获取系统运行进程等功能。 C# 中的 Process 类位于 System.Diagnostics 命名空间下,它允许你启动、控制和与外部应用程序进行交互。通…
-
C# stackalloc与数组的性能对比 – 临时小数组的最佳选择
stackalloc配合Span是处理临时小数组最高效方案;它在栈分配、免GC、缓存友好,适合≤128字节且生命周期短的场景,但需unsafe上下文且不可逃逸。 在C#中处理临时小数组时,stackalloc 和常规堆数组(如 new int[10])各有优劣。选择哪个更高效,取决于使用场景、数组大…
-
.NET中的Span和Memory:高性能内存操作的瑞士军刀
Span和Memory提供高效内存操作,Span适用于栈上安全切片,避免拷贝,提升性能;Memory支持跨方法边界和异步场景,结合ArrayPool可复用内存,减少GC压力,优化高频调用路径。 <img src="https://img.php.cn/upload/article/0…
-
C#中的Lambda表达式是什么?从委托到Lambda的演进与高级用法
Lambda表达式是C#中用于简化委托定义的匿名函数,从委托、匿名方法逐步演进而来,通过=>操作符实现参数与表达式的简洁连接,提升代码可读性与开发效率。 在C#中,Lambda表达式是一种简洁、灵活的语法,用于创建匿名函数。它本质上是对委托的简化表达方式,从早期的委托定义逐步演进而来,极大提升…