![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#基础
文章平均质量分 88
懒人Ethan
毕业于天津理工大学,拥有超过10年dotnet和前端开发经验。PMP认证,Microsoft Certified认证。精通ASP.NET/ASP.NET Core、Angular和Vue的开发。
展开
-
C#中的IQueryable vs IEnumerable (二)
IQueryable 的主要作用是通过其扩展方法和调用过程中使用的委托参数,将这些内容转换成表达式目录树。第三方的ORM框架可以在此基础上进行SQL语句的转换。原创 2023-09-11 18:28:20 · 932 阅读 · 1 评论 -
C# Linq源码分析之Take(四)
本文主要对Take的优化方法进行源码分析,分析Take在配合Select,Where等常用的Linq扩展方法使用时候,如何实现优化处理。本文涉及到Select, Where和Take和三个方法的源码分析,其中Select, Where, Take更详尽的源码分析,请参考我之前写的文章。原创 2023-08-28 14:25:28 · 1006 阅读 · 0 评论 -
C# Linq源码分析之Take (三)
本文在前两篇Take源码分析的基础上,着重分析Range参数中有倒数的情况,即分析TakeRangeFromEndIterator的源码实现。原创 2023-08-18 17:33:55 · 413 阅读 · 0 评论 -
C# Linq源码分析之Take (二)
本文主要分析Linq中Take带Range参数的重载方法的源码。原创 2023-08-17 15:44:05 · 731 阅读 · 0 评论 -
C# Linq源码分析之Take (一)
新的Take重载方法不再接收整数参数,而是接收一个Range类型的参数。它可以从序列中返回指定范围的连续元素。注意:该方法只能在.Net 6 或更高版本中使用,我们之前用的.Net 4.7, 4.8或.Net Core 3.1中,都不支持该方法。原创 2023-08-14 15:26:06 · 949 阅读 · 0 评论 -
C# Linq源码分析之Take方法
基本功能是从序列source中,返回指定个数count的相邻元素。原创 2023-08-11 16:44:06 · 1745 阅读 · 0 评论 -
C# 中使用ValueTask优化异步方法
我们在开发过程中,经常使用async的异步方法,但是有些时候,异步的方法中,可能包含一些同步的处理。本文主要介绍通过ValueTask这个struct,优化异步处理的方法性能。原创 2023-08-01 14:22:34 · 577 阅读 · 0 评论 -
C#中 使用yield return 优化大数组或集合的访问
我们在开发过程中,经常需要在一个很大的数组或集合中搜索元素,以满足业务需求。本文主要介绍通过使用yield return的方式,避免将大量数据全部加载进入内存,再进行处理。从而提高程序的性能。原创 2023-07-31 13:58:10 · 384 阅读 · 0 评论 -
浅谈C#中await运算符在不同类型应用中的不同行为
C#中的await运算符,因其不会阻塞主线程,可以给用户更好的操作体验,所以广泛的应用于各种C#的应用中。本文主要分析其在Console程序,Winform程序和WebApi程序中,其工作行为的异同点,来更好的使用该运算符。原创 2023-07-24 18:04:58 · 452 阅读 · 0 评论 -
C# LINQ源码分析之ToList()
在开发过程中,LINQ的ToList()方法经常被使用,帮助我们将将迭代器转换为具体的List对象。为了更好的了解该方法的工作原理,我们从源码的角度对其进行分析。原创 2022-07-12 17:32:24 · 5212 阅读 · 1 评论 -
C# LINQ源码分析之Count
LINQ代码库中的Count方法作为数据统计的关键方法,经常被使用。在统计数据时候,Count方法是否每次都要遍历整个序列来获取序列元素个数,Count方法内容是否存在优化机制。为了更好的了解该方法的工作原理,我们从源码的角度对其进行分析。......原创 2022-07-04 16:07:05 · 3562 阅读 · 1 评论 -
C# LINQ源码分析之SelectMany
概要在开发过程中,LINQ代码库中的SelectMany方法作为嵌套循环的语法糖,经常被使用,为了更好的了解该方法,我们从源码的角度对其进行分析,以了解其内部工作方式。SelectMany方法介绍SelectMany方法的基本功能是将序列中的每个元素投影到IEnumerable中,并将生成的序列平铺到一个序列中。LINQ代码库提供了4个SelectMany的重载方法如下:方法名称基本介绍SelectMany<TSource,TCollection,TResult>(I原创 2022-02-22 11:46:07 · 2438 阅读 · 0 评论 -
C# LINQ源码分析之Select
在开发过程中,LINQ代码库中的Select方法经常被使用,为了更好的了解该方法,我们从源码的角度对其进行分析。了解如何以最优的方式,使用该方法,从而提升代码的性能。原创 2022-02-15 17:27:54 · 10825 阅读 · 2 评论 -
C# LINQ源码分析之迭代器
迭代器是LINQ中的很多方法的实现基础,像Where,Select或Distinct等常用的LINQ方法底层都是通过迭代器最终实现的。本文从源码角度解释一下迭代器的工作原理,包括像延迟加载,多线程支持,嵌套循环这些问题,如何通过源码最终实现的。本文以Distinct方法来作为例子,说明迭代器的工作原理。将源码中的iterator.cs, Distinct.cs抽取出来,加上一定的日志,以方便我们了解代码的执行流程。原创 2022-02-11 23:09:14 · 933 阅读 · 0 评论 -
C# Linq 源码分析之Distinct方法
C# Linq 源码分析之Distinct方法原创 2022-02-10 15:19:21 · 5857 阅读 · 0 评论 -
C#中的IQueryable vs IEnumerable
概要我们在应用开发中经常用到IQueryable 和 IEnumerable两个接口。如果这两个接口搞混,往往会对程序性能造成很大的影响。本文以一个实例来区分这两个接口,说明在实际开发过程中,这两个接口如何使用。基本定义IEnumerableIEnumerable 是一个接口,客户代码通过实现该接口的GetEnumerator方法,来返回一个具体的IEnumerator.在实际应用中,IEnumerable 面向内存对象,它会将所有的数据载入到内存中,再进行各种操作。**IQueryable原创 2021-12-02 17:17:34 · 7270 阅读 · 2 评论 -
ASP.NET CORE Startup文件优化
概要根据ASP.NET CORE的设计思想“Pay for what you use”,在开发过程中,大量的服务配置相关的代码,像EntityFramwork,redist,Jwt, Swagger等等的服务初始化配置内容,都要通过依赖注入的方式引入项目。这就意味着,所有服务的配置相关代码都要放到Startup.cs文件中。本文目的是介绍通过技术改进,实现Startup.cs文件中代码的优化管理。已有解决方案的弊端基于表达式目录树的解决方案...原创 2021-08-06 15:30:46 · 475 阅读 · 1 评论 -
C# Linq源码分析之Where
概要在Dotnet 开发过程中,无论是Web还是Form或是其他领域的开发,Where作为IEnumerable的扩展方法,十分常用。本文对Where方法的关键源码进行简要分析,以方便大家日后更好的使用该方法。本文分析的源码来自 https://github.com/dotnet/runtime.git代码结构分析Where方法的过滤功能主要通过迭代器实现,其源代码包含7个迭代器。按照功能划分如下:索引参与过滤操作运算的迭代器WhereIterator,容器包含Enmuerable,List和A原创 2021-07-23 16:29:08 · 1960 阅读 · 6 评论 -
C#表达式目录树系列之5 –动态创建查询表达式
概要在项目开发中,根据用户的需求,我们的查询表达式一般是固定的,任何新的查询需求都要通过代码的修改来实现。而对于不确定的查询条件,固定查询表达式显然是行不通的。针对固定查询表达式存在的问题,我们提出基于表达式目录树的解决方案,因为它能帮助我们自动构建任何需要的查询表达式,以应用对各种复杂的查询场景。本文介绍一个基于URL参数动态构建查询表达式的实例。希望读者可以充分体会到表达式目录树为我们带来的巨大便利。完整代码已经上传CSDN,需要的读者可以免费下载,如果下载失败请留言告诉我邮箱。设计及关键代码实原创 2021-02-02 18:10:30 · 3033 阅读 · 7 评论 -
C#表达式目录树系列之3 -- 为EF查询实现动态OrderBy
概要在后端开发中,我们常碰到这样的需求,用户需要对数据进行排序和分页,但是基于哪个栏位排序不确定,需要根据用户在页面上的操作动态获取,并且可能有一个或多个栏位参与排序。对于此类需求的一般做法是,前端根据用户的输入生成一个对应的URL,包括分页数据和排序数据。例如: https://xxxx/students?pagestart=1&pagelength=10&orderby=Department desc,Name对于后端,通过URL地址,获取分页和排序信息,需要使用EF的排序。我们想原创 2020-12-23 16:09:30 · 1851 阅读 · 0 评论 -
C#表达式目录树系列之2 --常见的表达式目录树的实例
概要本文主要列举出一些常用的表达式目录树实例,便于以此为基础,构建更复杂的表达式目录树,以满足各种多变的业务场景。表达式目录树的构建,除了使用Expression类提供的静态方法外,一般还需要同反射结合在一起。例如通过反射找到类中具体定义的方法,通过反射找到类中的构造函数等。常用表达式目录树构建实例Student类的定义详见附录。访问对象的属性构建目标 s => s.FirstName s是Student类型代码如下:ParameterExpression sParameter = E原创 2020-12-23 12:04:39 · 2078 阅读 · 5 评论 -
C#表达式目录树系列之1 -- 表达式目录树基本概念
概要本文主要是帮助读者搞清楚什么是表达书目录树,表达书目录树能做什么,如何创建表达书目录树。后续几篇文章侧重于表达书目录树的具体应用。表达式目录树是什么表达式目录树是一种树型结构,它将代码以数据的形式来存储在树的各个节点中,树型结构的每个节点都是一个表达式。这句话初听很拗口,举个例子。相信大家都使用过ADO.NET中的SqlCommand类,把拼装好的SQL代码作为参数实例化该类,SQL代码就能执行。事实上,这种方式采用了和表达式目录树同样的设计思想。只不过SQL代码是以字符串的形式存储。这种设计原创 2020-12-23 11:31:14 · 2512 阅读 · 0 评论 -
C#中的事件和委托那些事
概要我们在做C#的WinForm,WPF或Web Form开发时候,总是要与事件和委托打交道。可能大家会有这些疑问,到底什么是事件,什么是委托,事件和委托是什么关系,事件模型又是什么,为什么C#的事件语法糖会引起歧义,委托是不是可以替代事件。本文希望能通过一个收短信拿快递的例子,帮助大家理清事件和委托的这些事。基本定义事件与委托的定义按照MS的定义如下:事件:Events enable a class or object to notify other classes or objects whe原创 2020-12-16 14:26:28 · 377 阅读 · 2 评论 -
C#中的协变与逆变
大家都知道基类的指针(引用)指向派生类的对象,作为OOP中多态的基础,大量应用于各种项目中,以增强代码的可扩展性。协变、逆变以及不变,都是是在此基础上,阐明了对泛型类的继承规则要求,让泛型类型也获得像基类指针(引用)指向派生类的对象这样的便利,以增强代码的灵活性。定义定义直接引用微软官网的定义:Covariance(协变):Enables you to use a more derived type than originally specified.翻译: 该类型要求使用更多的派生类行而不是原始原创 2020-09-28 18:07:40 · 306 阅读 · 0 评论 -
C#的Attribute和Typescript的装饰器之比较
概要C#的Attribute和Typescript的装饰器都可以实现AOP,以达到优化代码结构的作用。两者都可以在不修改原有代码的基础让,添加新的功能到已有类中,但是却采用了不同的实现方式。本文以一个字符串最大长度的限定的例子,来比较二者的实现方式。概念比较在C#中,通过定义一个类,该类继承Attribute类,来作为作为饰器使用。从而实现对类,类中的属性,方法,方法参数等的装饰。在C#的编译器会先实例化装饰类,再实例化被装饰的内容,这就决定了在该装饰饰器类内部,是无法访问到装饰修饰的对象,所以装饰原创 2020-11-25 18:25:13 · 1196 阅读 · 1 评论 -
解决Asp.Net Core 3.1 中无法读取HttpContext.Request.Body的问题
解决Asp.Net Core 3.1 中无法读取HttpContext.Request.Body的问题需求问题描述问题解决解决方案注意事项问题分析附录需求根据项目需要,要为WebApi实现一个ExceptionFilter,不仅要将WebApi执行过程中可能产生的异常信息进行收集,还要把WebApi的参数信息进行收集,以方便未来定位问题。问题描述对于WepApi的参数,一部分是通过URL获取,例如Get请求。对于Post或Put请求,表单数据是保存在Http请求的Body中的。基于此,我们可以在Ex原创 2020-08-13 18:41:40 · 9434 阅读 · 3 评论 -
C#表达式目录树系列之4 -- 解决C#泛型约束与无法创建带参数的泛型实例的矛盾
解决C#泛型约束与无法创建带参数的泛型实例的矛盾问题提出问题分析解决方案基于反射的解决方案基于表达式目录树的解决方案代码附录反射解决方案完整代码表达式目录树解决方案完整代码问题提出有时候我们在项目中,为了提高代码的可扩展性,有这样的需求。在自己创建的泛型类,例如 class Aircraft中,将泛型类型T直接实例化。C#可以支持这样做,但是是有条件的,代码如下:public class Aircraft<TEngine> where TEngine : class, new(){ p原创 2020-08-06 15:15:04 · 1502 阅读 · 2 评论