NET Core跨平台+CoreCLR+C#
文章平均质量分 70
.NET Core 是一个通用的开放源代码开发平台。 可以使用多种编程语言针对 x64、x86、ARM32 和 ARM64 处理器创建适用于 Windows、macOS 和 Linux 的 .NET Core 应用。 为云、IoT、客户端 UI 和机器学习提供了框架和 API。
风神.NET
比较认真。编程就是算法和数据结构,算法和数据结构是编程的灵魂。
展开
-
C# Emit技术详解
C# 中的 Emit 技术是一种强大的元编程(metaprogramming)技术,允许您在运行时生成和动态修改 C# 代码。这种技术通常用于创建动态生成的程序集、实现 AOP(面向切面编程)、序列化对象、创建动态代理等场景。它是通过 System.Reflection.Emit 命名空间中的类来实现的。原创 2024-03-31 15:49:59 · 477 阅读 · 0 评论 -
[C#基础知识] ReadOnly关键字修饰的变量可以修改,只是不能重新分配
对于简单类型(如int),更改是等于重新赋值,因为默认操作符只有=, 但于对于复杂类型,就不一定了。修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中.集合容器类,在其中包括默认的实现,然后允许用户在开发中进行添加或替换。微软示例和开源代码中用的一种开发扩展的方式就是使用静态的。关键字是可以在字段上使用的修饰符。的变量进行修改操作,形成思维定势,这个观念是错误的。修饰的变量在以后是不能修改的,在以后的开发中从不对。首先要明确一点:更改!对于集合类型,增加,移除,清空内容。转载 2024-03-26 23:04:22 · 60 阅读 · 0 评论 -
.NET源码分析之List
来实现的,比如当前集合5个元素,要移除第3个元素,实际结果是将数组的第4个元素到最后一个元素拷贝然后粘贴替换到数组的从第3个元素开始,这样就把第三个元素给替换掉了,然后再把数组的最后一个元素给置为默认。为4,当给集合添加第5个元素时,底层实现数组则是创建一个新数组,新数组的长度是当前数组的2倍,然后将当前数组的数据拷贝到新数组中,最后将第5个新元素加入数组中;2、带集合大小的构造,如果传入的是有效的集合大小,则创建对应大小的数组。的底层是数组,数组在声明的时候是需要有一个固定长度的,指的就是数组的长度,转载 2023-12-14 14:38:16 · 6050 阅读 · 0 评论 -
.net core源码分析 – List<T>
List初始大小是4,自动扩容是以当前数组元素的两倍或目标list的元素个数来扩容(哪个大选哪个)。如果有比较确定的大小可以考虑提前设置,因为每次自动扩容需要重新分配数组和copy元素,性能损耗不小。List通过version来跟踪集合是否发生改变,如果在foreach遍历时发生改变则抛出异常。List并非线程安全,任何使用的时候都要考虑当前环境是否可能有多线程存在,是否需要用锁来保证集合线程安全。转载 2023-11-30 16:51:15 · 1074 阅读 · 0 评论 -
CLRCore(CLR核心机制)
C#和CIL的关系:C#和N#都是CIL实现,但是彼此不能互通:C#和N#公开不分满足规范,我们才能互通CLS就是描述多语言互通的规范。转载 2023-11-07 15:17:03 · 2160 阅读 · 0 评论 -
基于net6 的C# 实现AQS
在 .NET 6 中实现一个简单的AQS(AbstractQueuedSynchronizer)是可能的,尽管它可能会涉及一些底层的线程同步机制。方法,用于获取和释放锁。请注意,这是一个非常简化的示例,实际的AQS更为复杂,并包括更多的功能和线程安全控制。这些工具能更安全和高效地处理线程同步。但上面的示例可以帮助你理解AQS的一些基本概念。在真实的应用中,更复杂的同步器通常需要使用.NET提供的更高级的同步工具,如。这个示例实现了一个非常基本的独占锁,MyAQS 类有。原创 2023-10-25 19:37:44 · 903 阅读 · 0 评论 -
MassTransit是什么?
MassTransit是一个用于.NET的开源分布式应用程序框架,主要用于构建基于消息、异步和事件驱动模式的系统。它旨在简化依赖于消息模式的应用程序的开发,包括发布-订阅、请求-响应和消息路由等模式。MassTransit提供了工具,用于实现跨多个消息交互跨足的长时间运行过程,称为saga,从而使您可以建模复杂的业务流程。MassTransit是.NET生态系统中构建分布式系统的热门选择之一,因为它抽象了消息基础设施的复杂性,并提供了高级别的、开发人员友好的API。原创 2023-10-01 22:35:36 · 1000 阅读 · 0 评论 -
C#常用容器源码分析
泛型支持多类型,但需要指定类型,不用转换类型,不用装箱/拆箱操作,效率更高,使用范围广。的更新需要加1和数组长度取模,这样做的好处是在出队后再入队的情况下节省空间,不用一直扩容。,当容量小于90%时会换个小的数组(手动调用。根据源码的接口派生关系,可得到UML图。把元素串起来,是链地址法。用一段代码验证一下猜想。,好像不会自动调用),映射的值,当冲突时通过。时容量满了会2倍扩容。转载 2023-09-07 22:31:22 · 185 阅读 · 0 评论 -
C# 执行 Cmd 命令
类,您可以运行 CMD 命令并在应用程序中捕获其输出。当您需要自动执行需要命令行工具或实用程序的任务时,此方法非常有用。方法来等待命令完成。命令的输出被打印到控制台。以在新控制台窗口中运行该命令。属性以捕获命令的输出。以防止显示控制台窗口。通过使用 C# 中的。转载 2023-08-10 20:20:39 · 3034 阅读 · 0 评论 -
C#实现Diff算法
Diff算法是一种比较两个文本文件差异的算法,主要分为两个步骤:生成编辑脚本和应用编辑脚本。以上代码是比较两个字符串的差异,并将结果存储在列表中,以便进一步处理。其中,Diff方法接收两个字符串参数,返回一个字符串列表,表示两个字符串之间的差异。列表中每个字符串都以符号或空格开头,分别表示添加删除和未修改的字符。原创 2023-08-08 23:31:16 · 330 阅读 · 0 评论 -
.NET Core(C#) Emit的使用
反射允许我们在运行时获取对象的相关信息,创建对象的实例,执行方法。Emit是作为反射的一个比较高级的功能。使用Emit,可以从零开始动态的创建程序集及类。提供程序的灵活性。本文主要介绍.NET Core(C#) 中Emit的使用,以及相关的示例代码。转载 2023-08-08 19:38:00 · 298 阅读 · 0 评论 -
System.Data.DbType与各类数据库的数据类型的映射关系
【代码】System.Data.DbType与各类数据库的数据类型的映射关系。转载 2023-08-08 17:41:37 · 348 阅读 · 0 评论 -
C# 使用Emit深克隆
第一步是命名,因为需要把一个类的所有属性复制到另一个类,需要调用方法,而方法需要名字,所以第一步就是命名。需要获得类型的所有属性,虽然这里用了反射,但是只是用一次,因为这里用反射获得方法是在写IL代码,写完可以很多次使用,可能第一次的速度不快,但是之后的速度和自己写代码编译的速度是差不多,所以建议使用这个方法。这时无法使用之外,对于静态属性,使用上面代码也是会出错,因为静态的属性的访问没有权限,所以请看修改后的。方法,这个方法的速度很快,使用的时候需要知道 IL的,如果不知道,没关系,我接下来会仔细说。转载 2023-08-07 15:33:07 · 206 阅读 · 0 评论 -
源码上看 .NET 中 StringBuilder 拼接字符串的实现
总的来说,采用定长的字符数组来保存不定长的字符串,不可能完全避免所添加的数据超出剩余空间这样的情况,重新开辟新空间并复制原始数据过于耗时。采用链表的形式取消了数据的复制操作,提高了字符串连接的效率。对于来说,大部分的操作都在尾部添加,采用逆向链表是一个不错的形式。当然这个类本身有很多复杂的实现,本篇只是介绍了Append方法是如何进行字符串拼接的。转载 2023-08-07 14:11:39 · 764 阅读 · 0 评论 -
.Net Core基于Emit动态代理从零实现RPC 初级实现
从完整性上来讲,此项目已经非常完整了。可以根据这项目开发基于自己的RPC项目了。从 DefaultInvocationHandler 来进行实现。转载 2023-08-07 14:03:17 · 283 阅读 · 0 评论 -
C#中Emit实现ORM原理
首先,需要定义一个数据模型,这里使用一个简单的Studentget;set;get;set;get;set;} }然后,需要定义一个数据库表结构,用于将数据模型映射到数据库中。原创 2023-07-24 22:40:05 · 506 阅读 · 0 评论 -
说说线程池的工作原理
线程池是一种线程管理的技术,它通过预先创建一定数量的线程,然后在需要执行任务时从线程池中获取空闲的线程,将任务分配给它们来执行,从而避免了线程的频繁创建和销毁,提高了线程的复用性和性能。总之,线程池可以有效地管理线程的数量,避免了线程频繁创建和销毁的开销,提高了线程的利用率和执行效率。原创 2023-06-19 23:24:30 · 963 阅读 · 0 评论 -
说说NetCore线程池的详细原理
总之,.NET Core 线程池的设计目标是为了在多个并发任务之间高效地分配线程,从而提高应用程序的性能和可扩展性。通过使用工作项队列、线程状态、工作项类型和 IO 完成端口等机制,.NET Core 线程池可以更加智能地管理和调度线程,从而提高应用程序的性能和可扩展性。使用 IO 完成端口:.NET Core 线程池提供了 IO 完成端口的支持,它可以用于处理 I/O 操作。在 .NET Core 中,线程池是一个重要的组件,它通过使用线程池中的工作线程来处理应用程序中的多个并发任务。原创 2023-06-19 23:10:15 · 840 阅读 · 0 评论 -
C#中的类型和SQL Server中的类型对应关系
【代码】C#中的类型和SQL Server中的类型对应关系。转载 2023-06-06 16:02:51 · 295 阅读 · 0 评论 -
进程池原理
进程池(Process Pool)是一种常见的多进程编程技术,用于提高并发处理能力和资源利用率。它的基本原理是创建一组可重用的进程,这些进程可以接收任务,执行任务,然后返回执行结果。进程池通常会限制进程的数量,以避免资源过度消耗和系统负载过重。上面的代码中,首先定义了一个worker函数,它表示需要执行的任务,并返回任务的执行结果。然后,创建了一个包含 4 个进程的进程池,通过map方法将任务分发给进程池中的进程执行,并收集执行结果。因此,在使用进程池时需要根据具体的应用场景进行权衡和选择。原创 2023-06-06 15:56:56 · 240 阅读 · 0 评论 -
IHostingStartup源码分析
接口是在 ASP.NET Core 应用程序启动时运行的一个扩展点,因此,如果我们需要在应用程序启动时进行一些配置,可以实现该接口,并将实现类型所在的程序集添加到应用程序中。在此过程中,主机会扫描应用程序中所有的程序集,以查找实现了。应用程序中用于配置 Web 主机的对象,它提供了一系列方法用于配置 Web 主机选项、中间件、应用程序服务等。然后,主机会创建这些类型的实例,并依次调用它们的。例如,下面是一个简单的实现,该实现将自定义的中间件。在上面的代码中,我们首先创建了一个实现了。方法中,我们可以使用。原创 2023-06-06 14:25:46 · 3654 阅读 · 1 评论 -
CLR源码分析和构成模块
CLR(Common Language Runtime)是.NET Framework的核心组件,它负责将IL(Intermediate Language)代码转换成机器码并执行。CLR的源代码是非常庞大和复杂的,由许多不同的模块组成。NGENILGC(垃圾回收器)元数据TypeHandleTypeDescTypeMemberInfo以上是CLR源代码中的一些重要模块,它们相互依赖、相互作用,共同构成了.NET Framework的核心组件。原创 2023-06-05 17:11:48 · 454 阅读 · 0 评论 -
.NET Core 中内存池原理
通常,应用程序需要大量的小内存块,例如字符串、数组、对象等,这些小内存块的创建和销毁操作会导致大量的内存分配和释放,造成内存碎片,从而影响系统的性能和稳定性。固定大小内存池是预先分配一定数量的固定大小的内存块,应用程序可以重复使用这些内存块。动态大小内存池是根据应用程序的需要动态分配内存块,并在不需要的时候释放内存块。内存池的原理是预先分配一定数量的内存块,然后在应用程序中重复使用这些内存块,避免了内存的重复分配和释放,从而提高了系统的性能和稳定性。类封装了内存池中的内存块,提供了对内存块的读写操作。原创 2023-06-05 17:09:55 · 309 阅读 · 0 评论 -
.NET Core Apollo 配置中心
Apollo(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。本地部署:https://github.com/ctripcorp/apollo/wiki/Quick-Start。转载 2023-05-20 18:26:35 · 555 阅读 · 0 评论 -
C#表达式树解析步骤
C# 表达式树是一种将 C# 代码表示为对象树的方式,它提供了一种在运行时动态构建和执行代码的能力。表达式树可以用于构建 LINQ 查询、动态生成代码、ORM 框架等场景。表达式树是由表达式节点和参数节点组成的树形结构。表达式节点表示表达式的操作符和操作数,参数节点表示表达式的参数。在 C# 中,可以使用Expression类的静态方法和属性来构建表达式树。例如,可以使用方法创建一个常量表达式节点,使用方法创建一个方法调用表达式节点,使用方法创建一个参数节点。intintint。原创 2023-04-12 15:47:17 · 770 阅读 · 0 评论 -
AsnycLocal与ThreadLocal
【代码】AsnycLocal与ThreadLocal。转载 2023-03-10 20:46:15 · 683 阅读 · 0 评论 -
C# Emit应用场景
可以用于许多应用场景,其强大的动态生成代码的能力可以提高应用程序的性能和可扩展性,同时也可以实现一些复杂的功能。是一种在运行时动态生成代码的技术,它允许程序员在运行时生成和编译 C# 代码,然后在应用程序中执行该代码。转载 2023-03-09 17:38:11 · 617 阅读 · 0 评论 -
用C#举例单例模式应用场景有哪些
以上是单例模式的一些常见应用场景,当然还有其他一些场景也可以使用单例模式。需要注意的是,单例模式可能会带来一些问题,比如可能会影响可测试性、可扩展性等。在使用单例模式时,需要权衡其优点和缺点,选择合适的设计模式来解决问题。在上面的示例中,我们使用静态变量来存储单例实例,使用锁机制确保线程安全,私有化构造函数防止在类外实例化对象。单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。来访问该类的单例实例。原创 2023-02-28 18:34:22 · 1168 阅读 · 0 评论 -
C#模拟实现PageRank算法
PageRank算法是Google搜索引擎中用于确定网页重要性的算法之一。转载 2023-02-28 16:08:16 · 161 阅读 · 0 评论 -
C#用泛型委托 重构示例
方法使用循环遍历数组,将每个元素传递给委托,然后将委托的返回值设置为数组中对应元素的值。方法改为泛型方法,并将其类型参数标记为T。这使得我们可以将任何类型的数组传递给。这个示例可以通过泛型委托重构,以使其可以处理任何类型的数组,而不仅仅是。最后,我们遍历修改后的数组并打印每个元素的值。最后,我们遍历修改后的数组并打印每个元素的值。方法,并将一个将字符串转换为大写形式的委托。类型的委托,用于处理数组中的每个元素。方法中,我们将一个字符串数组传递给。方法中,我们将一个整数数组传递给。在这个示例中,我们将。转载 2023-02-23 20:11:21 · 268 阅读 · 0 评论 -
依赖注入和类继承
最后,这位勇敢的冒险家找到了高级开发人员并展示了该模式,以及它如何仅通过将构造函数注入的依赖项聚合为一个依赖项来使他们摆脱困境。现在所有的子类也必须在它们的构造函数中包含新的依赖项,并将它们传递给基类。这些更改在整个源码存储库中引起了很大的干扰,同时影响了生产代码和测试代码,延误了进度并使开发人员感到沮丧。的强大功能,开发人员制作了一个可以动态生成聚合服务的设备,完全消除了为每个聚合服务接口实现类的负担。几个开发人员想要子类化。,一个手边的依赖注入框架,他们冒险实现了许多伟大的子类。翻译 2023-01-16 21:32:29 · 308 阅读 · 0 评论 -
Net Core中访问 DI 服务的多种方式
ASP.NET Core 提供了一个内置的依赖注入框架,您可以利用它来注册和访问服务。我之前的一篇文章解释了在注册服务时可以使用的各种生命周期选项。一旦服务注册到 DI 容器,您就可以使用所谓的构造函数注入获取服务的实例。尽管构造函数注入是访问已注册服务的最常见方式,但还有一些其他选项可用于完成此任务。为此,本文通过一个简单示例讨论了这些备选方案。作为示例,我们将创建一个名为的简单类,该类基于接口。上面显示的代码非常简单。的实际实现对于本文的主题并不重要。所以,我们会让事情变得非常简单。现在,已使用。翻译 2023-01-15 23:00:27 · 339 阅读 · 0 评论 -
.NET Core 泛型服务(依赖于其他泛型服务)的依赖注入
泛型在这里可能有点令人困惑,因为泛型类型实际上并不是真正存在的类型。只有当你应用一个具体的泛型类型参数时,才会有一个类型。如果您现在想在事件处理程序中使用该对象,那么您将需要单独的事件处理程序类型来分别处理每个结果。我不完全清楚你到底想完成什么,特别是因为你的例子中的实现都是空的,但如果我猜的话,我会假设你在这里使用了太多的泛型。,如您所见,它支持泛型,因此我为每个可能的解析器提供了一个接口。这基本上是一个将在某个时候插入的常量类型。现在你的方法有一个基本问题:解析器返回一个具体类型的列表,例如 您的。翻译 2023-01-06 17:05:19 · 1124 阅读 · 0 评论 -
解决NETCore IdentityServer4.EntityFramework 在Mysql上字段过长的问题
和Identity的问题相似,通过替换掉默认的来实现新建一个类 实现默认提供的在Startup中注入我们自己实现的方法之后执行数据库迁移命令 数据库可以正常生成了!转载 2022-12-23 23:28:40 · 291 阅读 · 0 评论 -
基于Dictionary实现的Cache类
基于Dictionary实现的Cache类转载 2022-12-16 15:38:09 · 155 阅读 · 0 评论 -
C# 如何快速复制一个列表
可以把列表a到列表b,对b进行删除、添加,不会对a造成元素改变。有没一个简单的方法?转载 2022-12-16 15:20:34 · 682 阅读 · 0 评论 -
Dotnet设计规范 · 结构体定义
易变的属性指的是在调用属性返回值的时候返回的是新的实例,易变的属性会有很多的问题。结构体只能用在很小、很轻、而且不易变的属性,并且很少发生装箱的业务。注:不易变的另一个解释,请看 Point 类,不能对这个类的属性进行更改。补充:所有的字段都禁止公开,如果结构体的定义是字段公开,请不要公开这个结构体。一般结构体的定义都是公开属性,但是一些和COM传输的结构体就需要定义为字段。转载 2022-12-14 23:25:05 · 150 阅读 · 0 评论 -
学习之路二十九:泛型和委托在重构中的运用
其实就是想说在实践中进行思考,进行总结,最终一定会有不一样的收获!转载 2022-12-14 20:59:47 · 164 阅读 · 0 评论 -
.NET Core 下使用 Kafka
Broker:消息中间件处理节点,一个Kafka节点就是一个broker,多个broker可以组成一个Kafka集群。Topic:一类消息,例如page view日志、click日志等都可以以topic的形式存在,Kafka集群能够同时负责多个topic的分发。Partition:topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。Segmentpartition物理上由多个segment组成,下面2.2和2.3有详细说明。offset。转载 2022-12-13 17:35:58 · 1032 阅读 · 0 评论 -
C# 学习(六)—— 委托、 泛型委托与Lambda表达式
而对于C#的委托而言,声明一个委托时必须指定返回类型和参数,.NET编译器会严格检查方法的参数和返回类型和委托是否匹配,检查通过后才能进行转换。为了简化这个过程, .NET 框架为我们封装了三个泛型委托类,因此大部分情况下我们不必再声明委托,可以拿来直接实例化使用,方便了我们的日常。与普通类的使用方法相同,声明了委托之后,我们必须给委托传递一个具体的方法,才能在运行时调用委托实例。委托实例包含了被传递给它的方法的信息,在运行时,调用委托实例就相当于执行它当中的方法。类的类,这与一般类的声明语法不同。转载 2022-12-12 16:08:01 · 484 阅读 · 0 评论