.NET面试题(一)

本文介绍了C#中堆和栈的区别,堆栈的内存管理机制,委托和事件的用法,静态构造函数的特点,以及CTS、CLS和CLR的概念。还区分了值类型和引用类型,以及类与结构的异同。
摘要由CSDN通过智能技术生成

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类型使用,这会带来一定的性能损失;而对于类类型的对象,则不需要进行装箱。
   默认构造函数:如果没有定义任何构造函数,类会自动提供一个无参公共构造函数;而结构不会自动提供这样的构造函数,必须显式定义。

欢迎关注我的公众号“点滴分享技术猿”,原创技术文章第一时间推送。

关注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖的工人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值