.NET经典面试35题

.Net测试

1、说明值类型与引用类型的区别?

  • 值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
    引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
  • 所有的值类型均隐式派生自 System.ValueType。
    与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。
  • 与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将null 赋给值类型。
    每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
  • 值类型主要由两类组成:结构、枚举;结构分为以下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。
    引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型:object、string

2、简述C#中基础访问修饰符的作用?
Public:(公开)所有类的类成员,无限制访问;
访问范围:任何代码都可以访问
Protected:(受保护的):应用给类和内嵌类的所有成员;
访问范围:当前类以及所有的子类(仅仅对该类以及该类的派生类公开;)
Private:(私有):给所有类或者成员使用;
访问范围:只能在本类中访问
internal:应用给类和内嵌类的所有成员;
访问范围:应用于同一程序集
protected internal/internal protected:应用给当前类和内嵌类的所有成员;
访问范围:同一程序集和子类

3、ADO.NET中的五个主要对象?
Connection连接对象
Command执行命令和存储过程
DataReader向前只读的数据流
DataAdapter适配器,支持增删查询
DataSet数据级对象,相当与内存里的一张或多张表

4、C#中委托是什么?事件是不是委托?事件和委托的关系?
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的指针。
事件是一种特殊的委托。
委托和事件没有可比性,因为委托是类型,事件是对象。事件的内部是用委托实现的

5、重写和重载的区别?Ref与Out参数的作用是什么?

  • 重载:方法名相同,参数列表不同(参数个数,参数类型,不同类型的排列顺序不同)
  • 重写:当一个子类继承一个父类,而子类中的方法与父类中的方法名,参数个数,参数类型都完全一致时,就称子类中的这个方法重写了父类中的这个方法。

区别:重载编译时多态,重写运行时多态,重载不需要继承,重写必须继承。

  • out参数:输出参数 方法体中的out参数在方法体结束前,必须进行赋值。
    在调用具有out参数的方法时,需准备一个带有out关键字的相同类型的变量接收out的结果。
    out参数可以视为方法的返回值。
  • ref参数:引用传参 传进方法的参数,一旦在方法中发生改变,那么这个参数变量将永久性的发生改变。

如果遇到得方法中的参数带有out,ref关键字,那么在调用方法的时候,实参也必须带有out,ref关键字。

6、C#中的索引器是否只能根据数字进行索引?是否允许多个索引器参数?
索引器不只是根据数字进行索引的,参数的个数和类型都是任意的。
索引可以有多个参数,参数类型任意。

7、属性和Public字段的区别是什么?调用set设置的一个属性值,使用get方法读取的值一定是set设置进去的吗?
属性可以对设置值、获取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。
虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的。

8、装箱和拆箱?
装箱:从值类型转换到引用类型。
拆箱:从引用类型转换到值类型, 前提是装箱

9、CTS、CLS、CLR分别代表什么?对应的作用是什么?
CTS:通用类型系统,一种确定公共语言运行库如何定义、使用和管理类型的规范。
CLS:公共语言规范,是CLR定义的语言特性集合,公共语言规范是一组约束和构造,它充当库编写器和编译器的向导。
CLR:公共语言运行时,用于编码MSIL的代码,主要在.NET的后台环境下运行。

扫描二维码关注公众号,回复: 6201040 查看本文章

10、类和结构的区别?
类与结构都可以实例化
区别:
是引用类型,结构是值类型
有默认的构造函数和析构函数。结构没有默认构造函数,但可以声明构造函数,但必须带参数,没有析构函数
可以继承。结构不支持继承
必须实例化。结构的实例化可以不使用new

11、接口和类的区别?抽象和虚拟的区别?

  • 接口和类的区别?
    接口和类都可以从多个接口继承 接口和类都可以包含事件,方法,属性…
    区别:
    1. 类中可以有字段,接口中不能有字段
    2. 类中有构造函数和析构函数,接口中没有构造函数和析构函数
    3. 类中可以定义具体的方法和实现,接口中只能声明方法,不能实现方法
    4. 类可以实例化,接口不能实例化 类可以继承多个接口,但只能继承一个类
    5. 接口成员一定要是公开的,不能是静态和虚拟的,类不限制
  • 抽象和虚拟的区别?
    抽象方法和虚拟方法都用重写
    区别:
    抽象方法,子类必须实现;
    虚拟方法,子类可以重写,也可以不重写
    抽象方法只能声明,不能实现,必须重写;
    虚拟方法有声明有实现 抽象类不能实例化;
    包含虚拟方法的类可以实例化

12、String和stringBuilder的区别?

  • string是String的别名,它是不可变的,每次赋值都会重新分配内存空间,String类来自于System.Object,不能使用new string()来构造一个string对象。
  • StringBuilder是可变的,当长度超过时,StringBuilder 将自动创建一个更长的数组,把原来的数据复制到新数组中,来自于System.Text,可以实例化,支持空参。

13、DataReader和DataSet的区别?

  • DataReader 为在线操作数据, DataReader会一直占用SqlConnection连接,在其获得数据过程中其它操作不可以再使用SqlConnection连接对象。
    DataSet 为离线操作数据,DataSet会将数据一次性读入内存,然后断开连接,这时其它操作就可以使用SqlConnection 连接对象。
  • DataReader在获取数据时不能关闭连接。
    DataSet可以关闭连接。
  • DataReader读取速度快于DataSet。
  • DataReader一次只读取一行数据,所以占用内存较小。DataReader为只进且只读的,也就是只能单方向向前读取,如果你想回头去读取上一条数据是不允许的,并且不允许其修改数据。
    DataSet一次性读取所有数据,所以比较消耗资源,但也提高了灵活性,在断开数据库连接情况下你可以对数据进行任何 增删改查,按照任意的顺序读取数据,并可以将其写回到数据库。

14、简述单例模式的作用是什么?
封装了唯一性,可严格控制客户怎样访问及何时访问,内存中只有一个对象,可节约系统资源,提高系统性能。
实现:构造函数私有化,使用一个公开静态方法,使用一个静态属性进行判断当前窗口是否被创建,重写方法

15、C#中怎样进行异常捕获?
try…catch…catch…finally
发生错误时,层层上抛,只带找到匹配的catch为止
try:将预计可能引发异常的代码包含在try中
catch:发生异常,转入catch
finally:无论有没有发生异常,它总会在这个异常处理结构的最后运行

16、SQL中的三大范式是什么?
第一范式:字段不能有冗余信息,所有字段都是必不可少的。
第二范式:满足第一范式并且表必须有主键。
第三范式:满足第二范式并且表引用其他的表必须通过主键引用。

17、SQL注入是什么?怎样防止SQL注入?
sql注入是利用现有应用程序,将恶意的sql命令注入到后台数据库执行的一种恶意的操作
使用参数化的SQL就可以避免SQL注入,或者利用正则表达式

18、数据的完整性包括哪些方面?
实体完整性: 就是主键约束
参照完整性: 就是外键约束
区域完整性:一般认为是 NULL和NOT NULL ,CHECK

19、SQL中的左联接和右链接是怎样的查询?
左联接:如果左表的某一行在右表中没有匹配行,则在关联的结果集行中,来自右表的所有选择列表列均为空值。
右联接:将返回右表的所有行。如果右表的某一行在左表中没有匹配行,则将为左表返回空值。

20、事务,视图,索引都有什么作用?

  • 事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。
  • 视图是从一张或多张表中导出的一张虚拟表,虚拟表具有和物理表相同的功能,可以对虚拟表进行增删改查操作。
  • 索引是为了加速对表中的数据行的检索而创建的一种分散存储结构,相当于书的目录。

21、使用SQL语句查询第30到第40条数据(数据可能不连续)
SELECT TOP 5 * FROM A WHERE ID > (SELECT MAX(ID) FROM A WHERE ID IN(SELECT TOP 10 ID FROM A ORDER BY ID ASC))

SELECT TOP 5 * FROM A WHERE ID NOT IN (SELECT TOP 10 ID FROM A ORDER BY ID ASC)

22、数据和泛型集合的区别是什么?
数组是一个存储相同类型元素的固定大小的顺序集合。
数组定长,占用内存少,遍历速度快;
集合不定长,占用内存多,遍历速度慢;
数组存放类型只能是一种,集合可以不是一种;
在功能上,数组能实现的所有功能,集合都能实现;反之,集合能实现的某些功能,数组难以实现。

23、假设 int i=21;
①求~i结果是多少? ~i=-22
②求i%5的结果是多少? i%5=1
③int j=(i/5)++;j结果是多少? j=4

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

  • 数据操纵语言(DML):SQL允许用户或应用程序通过添加新数据、删除旧数据和修改以前存储的数据对数据库进行更新,用来操纵数据库数据命令。
  • 数据定义语言(DDL):SQL让用户定义存储数据的结构和组织,以及数据项之间的关系。用来建立数据库、数据库对象和定义列命令。
  • 数据控制语言(DCL):可以使用SQL来限制用户检索、添加和修改数据的能力,保护存储的数据不被未授权的用户所访问,用来控制数据库组件存取、权限等命令。

25、请描述Socket进行同步通讯编程的详细步骤。

  • 服务器端:
    第一步:创建一个用于监听连接的Socket对像;
    第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
    第三步:用socket对像的Bind()方法绑定EndPoint;
    第四步:用socket对像的Listen()方法开始监听;
    第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
    第六步:通信结束后一定记得关闭socket;
  • 客户端:
    第一步:建立一个Socket对像;
    第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
    第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
    第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
    第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
    第六步:通信结束后一定记得关闭socket;

26、详细介绍说明三层架构
数据访问层,业务层,表示层。
数据访问层(DAL)主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作
业务逻辑层(BLL)对传送数据进行逻辑判断分折,并进行传送正确的值。
表示层(UI)为了与用户交互的界面。
UI–BLL–DAL–BLL–UI

27、存储过程的作用是什么?
①加快系统的运行速度
②封装复杂操作
③实现代码重用
④增强安全性
⑤减少网络流量

28、JS基本数据类型有哪些?
JS基本数据类型分为两大类:简单数据类型和复杂数据类型
简单数据类型:数字类型(Number),字符串类型(String),布尔类型(bool)
复杂数据类型:空类型(null),未定义类型(undefined),对象类型(Object)

29、介绍“ ”,null,undefind的区别
“ ”:是字符串类型的默认值,占用内存
null:null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。转换为值返回0.
undefined:当声明的变量还未被初始化时,变量的默认值为undefined。转换为值返回NAN。

30、介绍post和get的区别

  • get 方法:【默认值】将数据附加在网址的后面进行传输
    ① 所有出现文件名(URL)的地方都可以打开?进行get方式传值
    ② 只能用来传输少量的数据
    ③ 在网址后面可以直接看到,不安全
    ④ 客户端以报文体的方式把表单数据提交给服务器
  • post方法:不会附加在网址后面(隐形的传值)
    ① post方式可以传大量数据(上传文件)
    ② 隐形传输,非常安全
    ③ 客户端以报文头的方式把表单数据提交给服务器

31、介绍一下const和readonly的区别
Readonly表示只读,定义的时候可以不用初始化,可以延迟到构造方法中进行初始化。
Const表示常量,定义的时候就要初始化。
Const默认是静态的,Readonly如果设置为静态就必须进行显示声明。

32、写出冒牌排序从小到大

 int[] array = new int[]{1,5,10,50,90,111,120,119,562,586,534};
 for (int i = 0; i < array.Length; i++)
   {
       for (int j = 0; j < array.Length-i-1; j++)
       {
           if (array[j]>array[j+1])
           {
               int tem = array[j];
               array[j] = array[j + 1];
               array[j + 1] = tem;
           }
       }
   }
   for (int i = 0; i < array.Length; i++)
   {
       textBox1.Text +=array[i]+ "  ";
   }

33、使用递归算法求出斐波那契数列

int get(int i)
 {
     int res=0;
     if (i==1)
     {
        res = 0;
     }
      else if (i==2)
     {
         res = 1;
     }
     else
     {
         res = get(i - 1) + get(i - 2);
     }
     return res;
 }

34、使用算法实现从一个数组中求出不重复数字的个数

int[] num = { 1, 2, 3, 5, 8, 1, 3, 6, 2, 2, 4, 1, 9, 2, 7, 8, 8 };
int count = 0;
for (int i = 0; i < num.Length-1; i++)
{      
 for (int j = i + 1; j < num.Length; j++)
 {
     if (num[j] == num[i])
     {
         count++;
         break;
     }
 }      
}
Console.Write(num.Length-count);
Console.Readly();

35、说出B/S和C/S的区别
C/S(客户端服务)
(体积)胖客户端
(效率)本地运行
(网络)依赖不强
(用户)体验更好
B/S(浏览器端服务)
(体积)瘦客户端
(效率)服务器端运行
(网络)必须依赖网络
(用户)体验度不高

猜你喜欢

转载自blog.csdn.net/weixin_43437202/article/details/89454493
今日推荐