.NET面试题(一)

发布时间:2023年12月20日

1.C#中堆和栈的区别?

???堆(Heap)和栈(Stack)是C#中两种分配内存的不同方式
???栈(Stack):是一种先进后出的内存分配方式。它用于存储基本数据类型和对象引用,它是一种连续的内存空间,存储在cpu的寄存器上,它的大小在编译的时就是已知的,因此分配内存就是分配固定的大小空间。栈的分配和释放都是系统自动的,方法调用时在栈中分配一块内存空间,方法结束会自动释放,所以它的分配和释放速度特别快。
???堆(Heap):是一种后进先出的内存分配方式。它用于存储对象和动态分配内存,它是一种非连续的内存空间,存储在程序地址空间的堆区。它的大小在编译的时候是未知的,因此它的分配是根据实际所需的进行分配空间。堆是由程序员手动申请,如果申请的是托管堆,那么这个回收释放是有垃圾回收器(GC)回收释放的,当对象不在被程序引用的时候,就会被垃圾回收器(GC)自动回收,如果是申请的是非托管堆,那么这个就需要程序员手动释放回收。因此它的释放速度相对较慢。

2.C#中的委托是什么?事件是不是一种委托?

??? 委托(Delegate)是一种类似C/C++的函数指针,可以把它看作为是一种安全的函数指针。委托是一种引用类型变量,它存储了对某个方法的引用,但这个引用可以在运行时改变,它本质上还是一个类,是定义了方法的类,它可以将方法作为参数传给另外一个方法。
???事件是基于委托的,它是一种特殊的委托,事件通常用于类之间的通信,其中一个类发布一个事件,而其他类可以订阅这个事件。当你触发事件时,所有订阅该事件的方法都会被调用。

3.C#静态构造函数特点是什么?

???静态构造函数是一个特殊的构造函数,它不能被继承,没有参数,不能被调用。静态构造函数只在类被加载到内存中时执行一次。如果类中包含 Main() 方法,那么该类的静态构造函数会在 Main() 方法执行之前被调用。
???执行顺序:静态变量>静态构造函数>实例变量>实例构造函数

4.分别解释一下CTS、CLS、CLR的含义

???CTS(Common Type System):通用类型系统。每种语言都定义了自己的类型,.NET通过CTS提供了公共的类型,然后翻译生成对应的.NET类型。
???CLS(Common Language Specification):通用语言规范。它是一种规范,用于定义编程语言的基本语法和语义,以便不同的编程语言之间可以互相通信和交互。不同语言语法的不同,.NET通过CLS提供了公共的语法,然后不同语言翻译生成对应的.NET语法。例如,C#、Visual Basic、C++等语言都遵循了CLS规范。
???CLR(Common Language Runtime):公共语言运行时。它是一种运行时环境,用于执行遵循CLS规范的编程语言的程序。CLR是.NET Framework的核心组件之一,它提供了内存管理、垃圾回收、类型安全和安全性等功能。CLR支持多种编程语言,包括C#、Visual Basic、C++等。有不同的CLR,比如服务器 CLR、Linux CLR(Mono)、Silverlight CLR(CoreCLR)。相当于一个发动机,负责执行IL。

5.C#中什么是值类型与引用类型?

???值类型(Value Types):是一种简单的数据类型,通常存储的是它本身,值类型包含基本数据类型(整数类型,浮点数类型,字符类型,波尔类型)、枚举、结构体、以及元组(C#7.0版本开始引入的),它是通常分配在栈中,因此它访问的速度特别快。
???引用类型(Reference Types):是一种复杂的数据类型,它存储的是对象引用地址,而不是对象本身,引用类型包含类、接口、数组、委托等,它通常分配在堆中,因此它可以动态分配内存和释放。

6.C#中类(class)与结构(struct)的异同?

???C#中的类(class)和结构(struct)是两种不同的数据类型。
???内存分配方式:类是引用类型,存储在托管堆(managed heap)中;结构是值类型,在栈上分配内存。
???继承和多态性:类支持继承和多态性,可以作为基类或派生类;结构是sealed类型,因此无法从结构派生出新的类型,不支持继承和多态性,不能作为基类。
???接口实现:类可以实现多个接口;而结构只能实现一个接口。
???大小限制:结构存储在栈上,所以其大小通常受到限制,一般不应该超过几百个字节,否则可能导致栈溢出;类存储在托管堆上,大小一般不会受限制。
???装箱和拆箱:对于结构类型的值,需要进行装箱(boxing)操作才能将其作为object类型使用,这会带来一定的性能损失;而对于类类型的对象,则不需要进行装箱。
???默认构造函数:如果没有定义任何构造函数,类会自动提供一个无参公共构造函数;而结构不会自动提供这样的构造函数,必须显式定义。

文章来源:https://blog.csdn.net/u010784529/article/details/135023209
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。