精选35个 .NET面试题

发布时间 2023-10-12 17:08:33作者: 大树2

.NET面试题
1.说明值类型和引用类型的区别

①值类型有结构体(数值类型、bool型、用户定义的结构体)、枚举、可空类型等;

引用类型有class、数组、interface 或 delegate、object、dynamic 和 string等。

②值类型System.ValueType 中派生的,直接存储数据值,内存是自动释放的;

引用类型System.Object类,引用类型存储对其值的引用,内存是.NET中会由GC来自动释放。

③值类型直接存放在栈中;引用类型存放在堆中,声明的变量只是存放指针位置。

2.简述c#基础访问修饰符的作用

①基础访问修饰符有:public、private、protected、internal、protected internal。

②public:公开的,运用于类以及类成员,范围:所有代码都可以访问。

③private:私有的,运用于类以及类成员,范围:当前类自身,只能在本类中访问,所有类成员默认访问修饰符。

④protected:受保护的,类、内嵌类的所有成员,范围:当前类以及所有的子类。

⑤internal:类、内嵌类的所有成员,范围:同一程序集。

⑥protected internal/internal protected:类、内嵌类的所有成员,范围:同一程序集和子类。

3.ADO.NET中的五个主要对象

①connection:建立与数据库的链接。

②command:用来对数据库发出一些指令。

③datareader:读取数据。

④dataadapter:是dataset和数据源之间的桥梁。

⑤dataset:打从数据库中所查询到的数据保留起来。

4.c#中委托是什么?事件是不是委托?事件和委托的关系

①委托是一个类,委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向一个函数的引用。

②事件是一种消息机制,它是一种特殊的委托。

③事件的命名为委托去掉 EventHandler 之后剩余的部分

5.重写和重载的区别?ref和out参数的作用?

(1)重载和重写

①重写:它表示重写基类的方法,方法的名称返回值类型,参数个数参数类型要与基类相同,改变的只是方法体。

②重载:方法的名称相同,不同的参数类型,不同的参数个数,不同的参数顺序。

③重写运行时多态;重载编译时多态;重写必须继承;重载不需要继承。

(2)ref和out

①out:输出参数,方法中的out参数在方法结束时,需要准备一个相同类型的变量接受out的结果,并且必须带out关键字。

②遇到方法中形参是out类型,则在调用方法的时候实参也必须带有out关键字。

③ref:引用传参,使用前要进行初始化,传进方法中的参数,如果在方法内发生改变,那么这个参数变量将会永久性发生改变。

6.c#中的索引器是否只能根据数字进行索引?是否允许多个索引器参数?

①索引器为c#程序语言中类的一种成员,它使得对象可以像数组一样被索引,使程序看起来更直观,更容易编写。

②索引器值不归类为变量;因此,不能将索引器值作为ref或out参数来传递。

③索引器不是只能根据数字进行索引,允许多个索引器参数

7.属性和public字段的区别是什么?调用set设置的属性值,使用get方法读取的值一定是set设置进去的吗?

①公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装,它使用get和set访问器来控制如何设置或返回字段值。

②属性的实质是方法。

③公共字段虽然在速度上快,但它必须开放字段为public,这样一来对象的调用者便可以直接修改其值,值的内容是否合法,运行中是否会出错,就没有了保障,进而会大大降低类的可重用性;相反,属性类似于方法,它可以对存入的变量的值进行处理,如果觉得该值不合法,可以就地变换或者直接提出警告。

④调用set设置的属性,使用get读取的值不一定是set设置进去的。

8.装箱和拆箱

①装箱:将值类型转换成引用类型----将小的包装成大的

②拆箱:将引用类型转换成值类型----将大的拆分成小的-----前提是先装箱

9.CTS、CLS、CLR分别代表什么?对应的作用是什么?

①CTS:通用类型系统,一种确保公共语言运行库如何定义使用和管理类型的规范。

②CLS:公共语言规范,它是许多应用程序所需的一套基本语言功能,要和其他对象完成交互。

③CLR:公共语言运行时,.NET Framework提供的一种运行环境,它运行代码并提供开发过程更轻松的服务。

10.类和结构的区别

(1)值类型和引用类型

①结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,通过使用结构可以创建更多的值类型。

②类是引用类型,引用类型在堆上分配地址。

③结构之间的赋值可以创建新的结构,类之间的赋值只是赋值引用。

(2)继承性

①结构:结构不能从另一个结构或类继承,本身也不能被继承。

②类:可以继承其他类和借口,自身也能被继承。

(3)内部结构

①结构没有默认的构造函数,但可以添加构造函数,没有析构函数,初始化可以不使用new

②类有默认的构造函数,有析构函数,必须使用new初始化。

11.接口和类有什么区别?抽象和虚拟有什么区别

(1)接口和类

①接口是负责功能的定义,通过接口来规范类,而类是负责功能的具体实现。

②一个类可以继承一个基类也就是父类,但可以实现多个接口

(2)抽象和虚拟

①抽象抽象函数只能包含在抽象类中;

②抽象函数只能声明函数,不能实现函数;

③继承了抽象类,必须实现所有的类中的抽象成员;

④抽象类可以包含抽象成员和普通的非抽象成员。(抽象类的成员可以是抽象成员和普通带实现成员的任意组合)

⑤抽象类无法进行直接实例化

⑥抽象类不能是密封的、静态的、私有的

⑦虚拟只能修饰函数或属性成员,不能修饰字段

⑧虚拟类也就是正常类

⑨虚拟成员的类也不能是密封的。

12.string和stringBuilder的区别

①string是对String起的别名,来自system.object,字符串初始化之后里面的内容不在发生改变,当引用指针发生改变,先创建个新的string对象,然后存储新的引用地址。

②stringBuilder来自system.text,使用前先进行实例化,支持空的构造函数,默认是空字符串,长度为零,引用类型;初始化过程可以指定初始大小,如果字符不超过指定范围,则不会更改存储位置引用,如果字符串改变后长度超出初始化大小,则在堆里面开辟一个新的地址空间,将原来的字符串中的内容复制到新的空间中,在追加超出长度的内容,旧的空间会自动删除,然后引用指向新的空间地址,新的空间大小是旧的空间大小的基础倍。

13.DataReader和DataSet的区别

①DataReader是数据管理提供者类,而DataSet是一般性数据类。

②DataSet获取数据需要通过桥梁DataAdapter的填充,由于DataReader本身就是管理提供者,它可以通过Command的ExecuteReader()方法就可以获取数据。

③DataReader是在线处理,当连接关闭后就不能读取数据;DataSet可以离线处理数据,它是把数据从数据库拷贝到本地存储,在关闭连接的情况下仍然可以在DataSet中处理数据,甚至可以在本地存储的表格中增加限制。

④DataReader只能正向读取数据,但不能修改数据;DataSet可以按任何顺序读行,可以按灵活的方式搜索、排序和过滤这些行,甚至可以改变这些行,然后将这些改变同步到数据库中。

⑤从DataReader读取数据的速度快于DataSet。

⑥由于DataSet是离线处理,所以当在事务处理中要锁定数据库时,不可以使用DataSet。因为当DataSet被填充以后,会自动断开与数据库的连接,此时不可能再对数据库进行锁定。

14.简单概述单例模式的作用

单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公开的场合适合使用。

15.c#中怎样进行异常捕获

try…catch…catch…finally…

​ 尝试执行try里面的代码,如果某段代码报错则立即进入catch中,如果没有报错,执行完try中代码即可。

​ 发生错误时层层上抛,直到找到匹配的catch为止,finally最终执行的代码。

16.SQL数据库的三大范式是什么?

①第一范式:所有的字段不能有冗余信息,所有的字段都是必不可少的。

②第二范式:满足第一范式并且表必须有主键。

③第三范式:满足第二范式并且表引用其他的表必须通过主键引用。

17.SQL注入是什么?怎么防止SQL注入

①SQL注入就是把SQL命令插入到web表单的输入域或页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。

②可以用存储过程来执行所有的查询;限制表单或查询字符串输入的长度;将用户登录名称、密码、等数据机密保存;检查提取数据的查询所返回的记录数量。

18.数据的完整性包括哪些方面

①参照完整性②区域完整性③实体完整性

19.SQL左联接右联接是怎样查询

①左联接:如果左表的某一行在右表中没有匹配行,则在关联的结果集中,来自右表的所有选择列均为空值;

②右联接:将返回右表的所有行,如果右表的某一行在左表中没有匹配行,则将为左表返回空值。

20.事务、视图、索引都是有什么作用

①事务:就是被绑定在一起的作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败,那么整个操作就失败,回滚到操作前状态。

②视图:视图是一种虚拟表,具有和物理表相同的功能,可以对视图进行增、改、查操作,对视图的修改不影响基本表,相比于多表查询,它使得我们获取数据更容易。

③索引:就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索,类似于生活中书的目录。

21.使用SQL语句查询第30到第40条数据(数据可能不连续)

select top(10)* from 表名 where id not in (select top(30) id from 表名)

22.数组和泛型集合的区别是什么

①数组定长,占用内存少,遍历速度快;

②集合不定长,不断发生改变,占用内存多,遍历速度慢;

③在功能上数组能实现的,集合都能实现,集合能实现的某些功能数组难以实现。

23.假设int i=21;

(1)求~i结果是多少 -22

(2)求i%5结果是多少 1

(3)int j=(i/5)++;j的结果是多少 4

24.T-SQL语言包含哪三种常用语言?详细叙述

①数据定义语言:SQL记录用户定义存储数据的结构和组织,以及数据项之间的关系。

②数据操纵语言:SQL允许用户或应用程序通过添加新数据、删除旧数据和修改以前以前存储的数据对数据库进行更新。

③数据控制语言:可以使用SQL来限制用户检索、添加和修改数据的能力,保护存储的数据不被未授权的用户所访问。

25.请描述socket进行同步通讯编程的详细步骤

(1)服务端:

第一步:创建一个用于监听连接的Socket对像;

第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;

第三步:用socket对像的Bind()方法绑定EndPoint;

第四步:用socket对像的Listen()方法开始监听;

第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;

第六步:通信结束后一定记得关闭socket;

(2)客户端:

第一步:建立一个Socket对像;

第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;

第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;

第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;

第五步:用socket对像的Receive()方法接受服务器发来的信息 ;

第六步:通信结束后一定记得关闭socket;

26.详细介绍三层架构

①UI 表示层:主要表示web方式,用户界面,将数据展示给用户

②LL业务逻辑层:主要针对具体问题的操作,也可以理解为对数据层的操作

③DAL数据访问层:主要对非原始数据的操作层,也就是对数据库操作而不是数据,具体为业务逻辑层和表示层提供数据服务。

④为了实现高内聚低耦合的思想,降低层与层之间的依赖,标准化,安全性。

27.存储过程的作用是什么

①存储过程是一种预编译的SQL语句

②允许模块化的设计,可以多次使用

③防止SQL注入

28.JS基本数据类型有哪些

①基本数据类型:数字类型、字符串类型、布尔类型

②特殊数据类型:未定义类型、空类型、对象类型

③复杂的数据类型:function(函数)、array(数组)、data(日期)

29.介绍“ ”、null、undefined的区别

① “ ”:是字符串类型的默认值,占用内存,是真实存在的;

②null:null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。转换为值返回0.

③undefined:当声明的变量还未被初始化时,变量的默认值为undefined。转换为值返回NAN。

30.介绍post和get的区别

①都是提交表单的方式,通过客户端以报文的形式提交给服务端

②get提交以报文头的方式显示到URL地址中,安全性较低,数据量小,速度快;

③post提交以报文体报文头的方式,安全性高,数据量大,速度慢。

31.介绍一下const和readonly的区别

①Const表示常量,定义的时候就要初始化,静态

②readonly只读,定义的时候可以不用初始化,可以延迟到构造方法中进行初始化。

32.冒泡排序从小到大

int[] array = { 23, 30, 18, 40, 21 };
for (int i = 0; i < array.Length-1; i++)
{
for (int j=0;j<array.Length-1- i;j++)
{
if (array[j]>array[j+1])
{
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
for (int i = 0; i < array.Length; i++)
{
Console.Write(array[i] + " ");
}
Console.ReadLine();
33.递归算法斐波那契数列

斐波那契数列:0,1,1,2,3,5,8,13,21,34,55.........

static int GetRes(int i)
{
int res = 0;
if (i == 1)
{
res = 0;
}
else if (i == 2)
{
res = 1;
}
else
{
res = GetRes(i - 1) + GetRes(i - 2);
}
return res;
}
34.使用一个算法实现从一个数组中求出不重复数字的个数

static void Main(string[] args)
{
int[] array = new int[]{1,2,3,1,2,3,1,2,3,6,6,6,1,2,5,5,4,4,6,6,2,2,1,7};
int count = 0;
for (int i = 0; i < array.Length; i++)
{
for (int j = i + 1; j < array.Length; j++)
{
if (array[j] == array[i])
{
count++;
break;
}
}
}
int sum = array.Length - count;
Console.WriteLine(sum);
Console.ReadLine();
}
35.说出B/S和C/S的区别

①体积:C/S胖客户端,B/S瘦客户端

②效率:C/S本地运行,B/S服务器端运行

③网络:C/S依赖不强,B/S必须依赖网络

④用户:C/S体验更好,B/S其次