![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#
文章平均质量分 91
C#
夜槿笙歌
这个作者很懒,什么都没留下…
展开
-
CLR via C#(三)垃圾回收
每个程序运行都需要各种资源,如文件、内存缓冲区、数据库等。要使用这些资源,就必须为代表资源的类型分配内存。原创 2023-09-17 22:20:44 · 529 阅读 · 0 评论 -
CLR via C#(二)线程栈与托管堆
运行时要求每个类型最终都要从Equals()ToString()GetType()thisFinalize()CLR要求所有的对象都用new操作符创建。在这期间,newnew:指非静态字段,是属于对象的。与之相对的静态字段是属于类的。:每个对象都是一个类型的实例,而每个类型都由一个Type类型的实例来表示。类型对象指针就是指向该Type实例的指针。当然,Type类型对象本身也是一个类型对象的实例,它的类型对象指针指向了它自己。:可以简单理解为一个指向“同步块”的指针,拥有这个同步块的对象可以支持线程同步。原创 2023-07-21 00:06:22 · 415 阅读 · 0 评论 -
CLR via C#(一)CLR的执行模型
CLR全称Common Language Runtime,即公共语言运行时。它可以为所有面向CLR的语言提供运行时的内存管理、程序集加载、安全性、异常处理和线程同步等功能。原创 2023-06-04 23:52:22 · 880 阅读 · 0 评论 -
C# LINQ查询
LINQ是Language-Integrated Query的缩写,它可以视为一组语言和框架特性的集合。LINQ可以对本地对象集合或远程数据源进行结构化的类型安全的查询操作。LINQ支持查询任何实现了接口的集合类型,无论是数组、列表还是XML DOM,乃至SQL Server数据库中的数据表这种远程数据源都可以查询。LINQ具有和这两大优点。原创 2023-01-16 09:31:44 · 3290 阅读 · 0 评论 -
C#中的多线程(一)
CPU(中央处理器)或内核/核心是实际执行程序的硬件单元。许多现代CPU都支持同时多线程(Intel称之为超线程),即使一个CPU能表现为多个「虚拟」CPU。进程(process)是某个程序当前正在执行的实例。操作系统的一项基本功能就是管理进程。每个进程都包含一个或多个线程。线程(thread)是操作系统能够进行运算调度的最小单位,也是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流。单线程程序的进程仅包含一个线程;多线程程序则包含多个。在多线程程序中运行具有正确行为的代码,就说代码是原创 2023-01-05 10:51:25 · 1020 阅读 · 0 评论 -
C#中的特性
特性(attribute)是一种允许我们向程序的程序集添加元数据的语言结构。它是用于保存程序结构信息的某种特殊类型的类。将应用了特性的程序结构叫做目标设计用来获取和使用元数据的程序(对象浏览器)叫做特性的消费者NET预定了很多特性,我们也可以声明自定义特性也就是说,我们在编写的类、方法、参数中添加了特性,编译器就会根据特性产生元数据,再将这些元数据放入程序集中。消费者就可以获取到这些元数据,并进行使用。如果还是不明白特性究竟是什么东西,我们就来自己实现一个特性,看看它究竟是如何运作的。...原创 2022-08-30 08:01:37 · 838 阅读 · 0 评论 -
C#中的反射
反射是指对程序集中的元数据进行检查的过程。那么利用反射可以做什么事情呢?它允许在运行时查看特性(attribute)信息。它允许审查集合中的各种类型,以及实例化这些类型。它允许延迟绑定的方法和属性(property)。它允许在运行时创建新类型,然后使用这些类型执行一些任务。...原创 2022-08-30 07:59:29 · 252 阅读 · 0 评论 -
C#中的集合
集合初始化器允许采用和数组声明类似的方式,在集合实例化期间用一组初始成员构造该集合。如果不使用集合初始化器,就只能实例化集合后,调用的Add()方法一个一个添加成员。事实上,使用集合初始化器时,编译器会自动生成Add语句,从而不需要开发者显式编码。也因如此,要想使用集合初始化器,就需要满足以下条件的其中一个(1)集合类型应该实现接口,从而确保集合包含Add()方法。(2)集合类型也可以只实现接口而不实现接口,但要将一个或多个Add()方法定义成接口扩展方法或集合类型的实例方法。...原创 2022-07-24 22:43:33 · 846 阅读 · 0 评论 -
C#委托与事件
委托是C#中的一个引用类型。它允许捕捉对方法的引用,并像传递其他对象那样传递该引用,也可以像调用其他方法一样调用被捕捉的方法。{a+b}我们同样可以使用C#为我们声明好的委托和。其中,代表有返回值的方法,代表无返回值的方法。{a+b}{a}{Name}{Age}...原创 2022-07-17 14:03:57 · 8545 阅读 · 2 评论 -
C#泛型的协变与逆变
当我们使用泛型编程时,可能会遇到如下问题,即将一个较具体的类型赋值给一个较泛化的类型是可行的,但在泛型中却无法编译通过。用不同类型参数声明同一个泛型类的两个变量,这两个变量不是类型兼容的——即使是将一个较具体的类型赋值给一个较泛化的类型。也就是说,他们不是协变量。 那么什么是协变?举个例子来讲,假设有X和Y两个类型,且X和Y之间有特殊关系,即每个X类型的值都能转换成Y类型。如果与也总有这样的特殊关系,那么就可以说“对协变”。那么为什么泛型不支持协变呢?我们可以假设C#允许泛型协变,看一下会发生什么:可以原创 2022-07-10 17:54:33 · 1390 阅读 · 0 评论 -
C#中的拆箱与装箱
在C#中,值类型是直接将数据存储在栈空间中;而引用类型是将数据存储在堆空间中,同时在栈空间中存储一个对该数据的引用。那么如果将一个值类型转换为一个它实现的某个接口或object会发生什么?结果必然是对一个存储位置的引用,且这个存储位置表面上存储的是这个引用类型的实例,实际上则是存储的值类型的值。这个转换称为装箱。相反的过程称为拆箱。装箱(从值类型转换到引用类型)需要经历如下几个步骤:拆箱(从引用类型转换为值类型)的步骤则相反:由于拆箱和装箱都会涉及到一次内存拷贝动作,因此频繁地进行拆装箱会大幅影响性能。不原创 2022-07-10 14:18:39 · 6464 阅读 · 1 评论 -
C#中的垃圾回收、资源清理及推迟初始化
垃圾回收是运行时的核心功能,旨在回收不再被引用的对象所占用的内存,并不会处理如数据库连接、句柄(文件、窗口等)、网络端口及硬件设备。此外,垃圾回收器根据是否存在引用来决定要清理什么,处理的是引用对象,并且只回收堆上的内存。如果维持一个对象的引用,就会阻止垃圾回收器回收对象所占用的内存。.Net垃圾回收器采用的是mark-and-compact算法(首先确定所有可达对象,然后移动这些对象,使它们紧挨着存放,有点类似于磁盘碎片整理)。一次垃圾回收周期开始时,垃圾回收器会识别出对象的所有根引用,然后遍历根引用所标原创 2022-07-02 14:22:01 · 1552 阅读 · 0 评论