精选35个 .NET面试题
.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其次