
C#
文章平均质量分 94
wnvalentin
某研究所,软件开发人员
展开
-
.NET 中密封类的性能优势
文章目录IntroPreface性能优势虚方法调用对象类型转换 (is / as)数组 Arrays数组转换成 Span检测不可达的代码寻找可以被密封的类型补充说明MoreIntro最近看到一篇文章 Performance benefits of sealed class in .NET,觉得写得不错,翻译一下,分享给大家。目前看到的一些类库中其实很多并没有考虑使用密封类,如果你的类型是不希望被继承的,或者不需要被重写的,那么就应该考虑声明为密封类,尤其是对于类库项目的作者来说,这其实是非常值得考虑的转载 2022-03-29 17:48:59 · 251 阅读 · 0 评论 -
在 xUnit 测试方法中共享测试上下文
在使用 xUnit 进行单元测试时,有时候我们需要在不同的测试类中进行一些相同的初始化或清理工作,这些代码称为测试上下文(test context)。根据范围的不同, xUnit 提供了三种共享测试上下文的方式:...原创 2021-06-16 10:45:00 · 943 阅读 · 0 评论 -
从IL层面认识await, async
文章目录从 IL 层面认识使用 WebClient 下载挖掘 await async 的IL代码`d__1` 类GetResult() 方法将 IL 代码回写为 C#完整 C# 代码剖析 AsyncTaskMethodBuilder第一次回调 MoveNext第二次回调 MoveNext总结await,async 这玩意的知识点已经被人说的烂的不能再烂了,看似没什么好说的,但我发现有不少文章还是从理论上讲述了这两个语法糖的用法,懂得还是懂,不懂的看似懂了过几天又不懂了,人生如戏全靠记是不行的哈??????转载 2020-08-25 11:21:30 · 548 阅读 · 0 评论 -
LINQ 延迟查询的原因
延迟查询在运行 LINQ 中的某些扩展方法进行集合的查询时,查询不会立即运行。只有当运行至 foreach 对查询结果进行遍历时,或者对查询结果调用 ToList() 方法等情况时,查询才会真正的运行。我们以 Where() 方法为例进行研究。考察如下代码:var names = new List<string> {"Nino", "Alberto", "Juan", "Mike", "Phil"};var namesWithJ = names.Where(n=>n.StartsW原创 2020-05-30 18:36:25 · 416 阅读 · 0 评论 -
C#与CLR学习笔记(8)—— 通过反射调用泛型方法
1 调用非泛型方法通过反射创建一个对象,然后调用其方法的一般过程为:加载程序集,并获取类型通过类型,实例化一个类型对象(调用静态方法则不必实例化)根据名称、方法签名、可访问性等约束,获取要调用的方法通过 Invoke 方法,传入实际参数,进行调用。案例:public class ReflectionTest{ // 无参构造函数 public ReflectionTest(){} public void Show(string name, int id)原创 2020-05-19 23:09:43 · 1486 阅读 · 0 评论 -
C#与CLR学习笔记(7)—— 泛型与泛型约束
文章目录1 泛型概述1.1 含义1.2 泛型的继承1.2.1 泛型类型的继承1.2.2 泛型的类型参数的继承2 泛型约束2.1 编译器对泛型参数的验证2.2 泛型约束的类型2.3 其他验证问题参考文献1 泛型概述1.1 含义使用泛型的主要目的有三个:(1)实现代码复用;(2)避免使用Object类,在实例化一个泛型类时,我们需要指定T的实际类型(类型实参),这样保证了类型安全;(3)减少了 Object 造成的装箱拆箱,提高性能(原理见下文)。对于编译器而言,泛型 T 本质上就是一个 类型参数(Ty原创 2020-05-17 01:15:50 · 347 阅读 · 0 评论 -
C#并发编程之初识并行编程
原文地址:https://mp.weixin.qq.com/s/0Sn_Me6kmcF0GCL7sWCq_g写在前面之前微信公众号里有一位叫sara的朋友建议我写一下Parallel的相关内容,因为手中商城的重构工作量较大,一时之间无法抽出时间。近日,这套系统已有阶段性成果,所以准备写一下Parallel的相关内容,正好也延续之前的C#并发编程系列。Parallel是并行编程的相关内容,而P...转载 2020-05-08 09:16:55 · 318 阅读 · 0 评论 -
C# 中的闭包
首先来看一个简单的例子。 var list = new Action[5]; for (int i = 0; i < list.Length; i++) { list[i] = () => { Console.WriteLine(i); }; } ...转载 2019-12-16 22:25:42 · 1021 阅读 · 0 评论 -
CLR 处理 Corrupted State Exception
文章目录异常 Exception 到底是个啥Win32 SEH 与 System.Exception 类托管代码与 SEH损坏状态异常(Corrupted State Exceptions, CES)不要捕获 Exception 基类正确的编码参考文献你是否曾经编写过不太正确或者接近正确的代码? 你的代码是否在一切顺利时能正确运行,但是一旦出错就不知道会错在哪里? catch (Exceptio...原创 2019-12-01 16:30:00 · 837 阅读 · 0 评论 -
.NET 4.0里异常处理的新机制
前几天,有一个朋友问我为什么在.NET里不能捕捉(catch)到一些异常了,而且在调试器里也捕捉不到。研究了一下,是.NET 4.0里新的异常处理机制捣的鬼。在.NET 4.0之后,CLR 将会区别出一些异常(都是SEH异常),将这些异常标识为破坏性异常(Corrupted State Exception)。针对这些异常,CLR 的 catch 块不会捕捉这些异常,即使你用类似下面的代码: ...转载 2019-12-01 13:23:35 · 204 阅读 · 0 评论 -
使用System.Text.Decoder类来处理“流文本”
何为“流文本”? 他就像“流媒体”,众所周知“流媒体”可以边传送数据边将已接收的不完整的数据预览给接收方。“流文本”亦如此。数据传输中的数据并不会按期望以一个整体直接被接收的,尤其是数据量比较大的情况(或者接收方接收速度有限的情况),都会使数据被分割成一块一块的形式传给接收方的。这个数据块的边界是没有任何规律的,因此所谓“流xx”模式实现的一大难点就是怎样把接收到的数据碎片正确分析并给用户提供即...转载 2019-09-21 19:44:58 · 727 阅读 · 0 评论 -
C#与CLR学习笔记(6)—— 轻松理解协变与逆变
Contents前言本质与原因简单本质产生原因广义上的协变与逆变参考文献前言协变(covariance)和 逆变(contravariance)是我们在学习泛型委托和泛型接口中遇到的比较抽象的一组概念。它们的使用方法,其实是非常简单的,即:用 in 标记的逆变量只能出现在泛型接口的方法的输入参数中,或者作为泛型委托的输入参数;用 out 标记的协变量只能作为泛型接口方法或者泛型委托的输出...原创 2019-08-25 14:15:39 · 639 阅读 · 0 评论 -
C#与CLR学习笔记(5)—— 值传递与引用传递
Contents1. 值传递与引用传递2. 使用 ref 传递值类型3. 使用 ref 传递引用类型4. ref 与 out 的区别上一篇文章介绍了值类型和引用类型使用上的区别。这里,我们来研究一下值类型和引用类型作为参数进行传递时不同的表现,以及原因。1. 值传递与引用传递CLR 对方法的参数默认是只进行值传递的,不管参数是值类型的参数还是类类型(即引用类型)的参数。所谓值传递,就是将参数...原创 2019-08-14 21:37:58 · 1107 阅读 · 0 评论 -
C# 委托(二)—— 多播委托与事件
目录1 多播委托1.1 多播委托的实例化1.2 多播委托的调用与返回结果1.3 多播委托的逐个调用2 事件2.1 事件的本质2.2 事件用法三步曲2.3 事件与多播委托的区别上一篇文章中,介绍了委托的基本用法(传送门:https://blog.youkuaiyun.com/wnvalentin/article/details/81840339)。本文中,我们来了解一下常用的...原创 2018-09-01 19:47:35 · 11157 阅读 · 1 评论 -
.Net Core 中 IConfigurationSource、IConfigurationProvider、IConfigurationBuilder、IConfiguration的关系
目录1 .Net中配置系统的缺点2 .Net Core中新的配置体系3 IConfigurationProvider 是个啥4 配置对象是如何创建的1 .Net中配置系统的缺点以前版本的.NET有一个相对简单的配置系统,所有设置都采用带有.config扩展名的XML文件;它有一个可以处理系统设置和无类型键值对的基本模式;此外它在一定程度上支持继承,因为某些设置可以在机器范围...原创 2018-12-11 18:19:45 · 5146 阅读 · 0 评论 -
Span<T> —— .NET Core 高效运行的新基石
原文:https://msdn.microsoft.com/en-us/magazine/mt814808.aspx目录Span 是什么鬼?Span 是如何实现的?Memory 又是什么鬼?Span 和 Memory 是如何与 .NET 库集成的?.NET 运行时有何变化?C# 语言及其编译器有啥变化?接下来呢?假定我们想要写一个方法,来对内存中的数据进行排序。...翻译 2019-06-24 16:45:57 · 4613 阅读 · 0 评论 -
C#与CLR学习笔记(3)—— 类型
目录1 基类型与类型转换1.1 System.Object的方法1.2 使用 new 创建对象的过程1.3 类型转换1.4 使用 is 和 as 进行类型转换1.5 命名空间2 类型、对象、栈、堆在运行时的相互关系类型对象指针1 基类型与类型转换1.1 System.Object的方法访问限制 方法 说明 public Equals...原创 2019-07-11 00:27:05 · 552 阅读 · 0 评论 -
C# 8.0 中的模式匹配
Contents模式匹配简介C# 8.0 中模式匹配的演变表达模式结语多年来,我们在 C# 中实现了许多功能,不仅改善了代码的性能,更重要的是还提高了代码的可读性。鉴于软件行业的快速发展,语言当然需要与其用户群同步发展。广泛用于 Haskell、Swift 或 Kotlin 等各种编程语言的某些功能,有时也会用于 C#。其中一个功能就是模式匹配,这一概念已经存在很长时间,是 .NET 领域中的许...转载 2019-08-14 11:04:03 · 1299 阅读 · 0 评论 -
C# 委托 (一)—— 委托、 泛型委托与Lambda表达式
目录1 委托的含义2 委托声明、实例化和调用2.1 委托的声明2.2 委托的实例化2.3 委托实例的调用3 泛型委托3.1 Func委托3.2 Action委托3.3 Predicate委托4 匿名委托5 Lambda表达式5.1 表达式Lambda5.2 语句Lambda1 委托的含义当需要将一个方法当作另一个方法的参数时,对于某些语言...原创 2018-08-19 20:46:47 · 26546 阅读 · 10 评论