16
2020
04

什么是线程

线程是微软公司提出的轻量级线程的概念,一个线程拥有自己的栈和寄存器状态。一个线程可以包含多个线程,和线程由操作系统调度所不同的是,线程内线程的调度完全由程序员自己控制,操作系统的内核完全不会知道线程的存在。在.NET 架构中,线程的概念不一定和操作系统的线程对应,有些情况下.NET 中的线程对应一个线程。  
16
2020
04

如何以较小的内存代价保存 Type、Field 和 Method 信息

System.RuntimeTypeHandle、System.RuntimeMethodHandle 和 System.RuntimeFieldHandle 三个类型,分别包含了一个指向类型、方法和字段描述的指针,用保存指针的方式来代替保存整个类型、方法和字段的信息描述对象,可以有效地减少内存的消耗。而在实际需要用到这些信息时,又可以通过这三个句柄类型对象,分别得到System.Type、System.Reflection.MethodInfo 和System.Reflection.Field
16
2020
04

如何利用反射来实现工厂模式

使用反射可以实现灵活性较高的工厂模式,其关键在于动态地查找产品所包含的所有零件,而不需要通过代码来逐一分析使用者的需求。反射工厂模式具有灵活性高,运行效率相对较低的特点。
16
2020
04

请解释反射的基本原理和其实现的基石

反射是一种动态分析程序集、模块、类型、字段等目标对象的机制,它的实现依托于元数据。元数据是存储在PE 文件中的数据块,它详细记录了程序集或模块内部的结构、引用的类型和程序集和清单。  
16
2020
04

请解释事件的基本使用方法

事件是一种使对象或类能够提供通知的成员。客户端可以通过提供事件处理程序为相应的事件添加可执行代码。事件是一种特殊的委托。
16
2020
04

什么是链式委托

链式委托是指一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。
16
2020
04

委托回调静态方法和实例方法有何区别

当委托绑定静态方法时,内部的对象成员变量:_target 将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
16
2020
04

请解释委托的基本原理

委托是一类继承自System.Delegate 的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序。
16
2020
04

在 System.Object 中定义的三个比较方法有何异同

静态方法 ReferenceEquals 实现了引用比较。静态 Equals 方法实现了比较高效地调用实例 Equals 方法的功能。实例Equals 方法是一个虚方法,默认的实现是引用比较,类型可以根据需要重写实例 Equals方法。值类型的基类ValueType 重写了Equals方法,实现了内容的比较。
16
2020
04

.NET提供了哪几个定时器类型

.NET 的内建类型中有三个定时器类型,分别是:  System.Windows.Forms.Timer类型  System.Threading.Timer类型  System.Timers.Timer类型
16
2020
04

如何使用 IFormattable 接口实现格式化输出

IFormattable接口帮助类型实现了多样式的格式化输出。IFormattable 的ToString方法接受一个代表格式的字符串参数,通过对这个参数的分析来进行格式化输出。另外,IFormattable.ToString方法接受一个IFormatProvider类型的参数,以允许类型的使用者提供格式化的方法。
16
2020
04

如何自定义序列化和反序列化的过程

通过实现 ISerializable 接口中的 GetObjectData 方法可以实现自定义的序列化,而通过添加带有SerializationInfo 和StreamingContext的参数的构造方法可以自定义反序列化的过程。
16
2020
04

Serializable 特性有何作用

通过为类型添加Serialization特性,可以使对象申明为可被序列化,也即是可被诸如BinaryFormmater等类型的对象序列化和反序列化。
16
2020
04

解释泛型的基本原理

泛型类似C++中的模板,允许程序员定义更通用的类型和算法,并且在具体使用时再生成具体的封闭类型。所有带泛型参数的类型都是一个开放式类型,它不能被实例化,但具备所有封闭类型的其他特性,本质上,它和封闭类型没有区别。
16
2020
04

Int[]是引用类型还是值类型

数组类型是一族类型,它们都继承自 System.Array,而System.Array又继承自System.Object。所有的数组类型都是引用类型。  
16
2020
04

在 C#中如何声明一个类不能被继承

C#中通过关键字:sealed可以申明一个类型不可被继承,设计中应该为所有不被作为基类的类型添加sealed关键字,以避免各种来自继承的易产生的错误。
16
2020
04

简述 C#中重写、重载和隐藏的概念

重写是指用 override 关键字重新实现基类中的虚方法,在运行的过程中,无论通过哪个类型的引用,真正对象类型的方法将被调用。隐藏是指用 new关键字重新实现基类中的方法,在运行的过程中通过引用的类型判断应该调用哪个类型的方法。重载是指多个方法共享同一个名字并且拥有相同的返回值,但是却可以拥有不同的参数列表。
16
2020
04

.NET中GC 的运行机制

垃圾回收是指收集释放托管堆上不再被使用的对象内存。其过程基本包括:通过算法找到不再被使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。 垃圾回收的运行成本较高,对性能的影响较大。程序员在编写.NET 代码时,应该避免不必要的内存分配,尽量减少或避免使用 GC.Collect来执行垃圾回收。
16
2020
04

简述.NET中堆栈和堆的特点和差异

.NET 的程序在进程内存中分配出堆栈、托管堆和非托管堆。所有的值类型对象和引用类型对象的引用都分配在堆栈上,堆栈根据对象的生存周期来依次分配和释放,堆栈根据一个指向栈尾的指针来分配内存,效率较高。 .NET 所有引用类型对象分配在托管堆上,托管堆连续分配内存,并且受.NET 的垃圾收集机制管理,受托管堆的内存分配和释放涉及复杂的内存管理,效率相对于堆栈来说低地多。 需要分配堆内存的非托管类型将被分配在非托管堆上,非托管堆不受.NET 垃圾收集机制管理,内存块完全由程序员手动申请和释放
16
2020
04

C#中string 和String 有什么区别

String 和 string 是同一个类型的两个名字,相同情况还有 Object 和 object。除了名称之外,两者没有任何区别。 
16
2020
04

值类型和引用类型的区别

所有继承自System.ValueType 的类型是值类型,而其他类型都是引用类型。值类型的赋值会产生一个新的数据副本,所以每个值类型都拥有一个数据副本,而引用类型的赋值则是赋值引用。值类型的对象分配在堆栈上,而引用类型的对象分配在堆上。当比较两个值类型时,进行的是内容比较,而比较两个引用类型时,进行的是引用比较。 
16
2020
04

怎么把程序集放入 GAC 中

GAC是一个具有特定目录结构的文件夹,所有强签名的程序集都可以被放入GAC中。可以通过.NET Framework自带的assembly viewer来简单地拖动添加一个程序集到 GAC 中,也可以利用诸如 gacutil.exe等工具使用命令行来添加。总之,任何方法归根结底,都是根据 GAC 的规范和程序集本身的特性,在GAC目录下建立相应的子目录结构。
16
2020
04

JIT是如何工作的

JIT 引擎在编译中间代码之前,会寻找方法的本机机器代码缓存并且判断其是否可用,如果可用则直接加载,如果不可用,JIT 引擎会查找类型中的方法存根,找到该中间代码并且进行编译。
16
2020
04

什么是 CTS、CLS 和CLR

公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库。 通用类型系统(CTS)包含在微软公司提交的 CLI 规范,定义了一个可以在 CLR 上运行的类型规范。 公共语言规范是 CTS的一个子集,定义了所有面向.NET 的程序所需要符合的最小规范集。 
31
2020
03

CLR 技术和 COM技术的比较

CLR 和 COM 都定义了组件间交互的规范。COM 并没有定义如何描述组件间的依赖性,并且由于其严格的物理约定,造成了很多组件版本升级和控制的问题。CLR 运用元数据和逻辑类型定义等机制,有效地解决了 COM 遗留的一些问题。并且,相较于 COM模型,笔者认为CLR 更容易理解和学习。
31
2020
03

什么是 CTS、CLS 和CLR

公共语言运行库(CLR)是一个CLI 的一个实现,包含了.NET 运行引擎和符合 CLI 的类库。 通用类型系统(CTS)包含在微软公司提交的 CLI 规范,定义了一个可以在 CLR 上运行的类型规范。 公共语言规范是 CTS的一个子集,定义了所有面向.NET 的程序所需要符合的最小规范集。