.Net测试试题(C#基础----C#高级编程----SQL Server----ADO.NET----Web前端)

版权声明:biubiubiu https://blog.csdn.net/a_lllll/article/details/89419258

.Net测试试题

范围:(C#基础–C#高级编程–SQL Server–ADO.NET–Web前端)

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

值类型:

  • 存储在堆栈中(后进先出)
  • System.ValueType 中派生的
  • 直接存储数据值
  • 内存是自动释放的
  • 调用速度快
  • 结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型

引用类型:

  • 存放在堆中(引用地址存储在栈中,再由栈(内存)向堆(硬盘)中进行访问)
  • System.Object类
  • 引用类型存储对其值的引用位置
  • 堆内存是.NET中会由GC来自动释放
  • 调用速度慢
  • class、数组、interface 或 delegate、object、dynamic 和 string

2、简述C#中基础访问修饰符的作用?

public(公开的)
所有类的类成员
访问权限:不受任何限制
private(私有的)
所有类或类成员使用
访问权限:只能在本类中访问
protected(受保护的)
应用给类和内嵌类的所有成员
访问权限:当前类及子类
internal
应用给类和内嵌类的所有成员
访问权限: 应用于同一程序集中
internal protected
应用给类和内嵌类的所有成员
访问权限:应用于同一程序集和子类中

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

DataConnection:连接对象

DataCommand:执行命令和存储过程

DataReader:向前只读的数据流

DataAdapter:适配器,支持增删查询

DataSet:数据存储器

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

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的后台环境下运行。

10、类和结构的区别?

同:

类与结构都可以实例化

异:

类是引用类型,结构是值类型

类有默认的构造函数和析构函数,结构不能声明默认的构造函数

结构没有析构函数

结构不支持继承

结构的实例化可以不使用new

结构可以声明构造函数,但必须带参数

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

接口和类的区别?

同:

接口和类都可以从多个接口继承

接口和类都可以包含事件,方法,属性…

异:

类中可以有字段,接口中不能有字段

类中有构造函数和析构函数,接口中没有构造函数和析构函数

类中可以定义具体的方法和实现,接口中只能声明方法,不能实现方法

类可以实例化,接口不能实例化

类可以继承多个接口,但只能继承一个类

接口成员一定要是公开的,不能是静态和虚拟的,类不限制

抽象和虚拟的区别?

同:

抽象方法和虚拟方法都用重写

异:

抽象方法,子类必须实现;虚拟方法,子类可以重写,也可以不重写

抽象方法只能声明,不能实现;虚拟方法有声明有实现

抽象类不能实例化;包含虚拟方法的类可以实例化

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、数据的完整性包括哪些方面?

实体完整性:每个表中有一个必须要指定的字段。
区域完整性:针对表中的某个字段进行特殊化限制。
参展完整性:表与表之间的一种特殊化关联限制。

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、存储过程的作用是什么?
存储过程:一组预编译的SQL语句。
①加快系统的运行速度
②封装复杂操作
③实现代码重用
④增强安全性
⑤减少网络流量

28、JS基本数据类型有哪些?

JS基本数据类型分为两大类:简单数据类型和复杂数据类型

简单数据类型:数字类型(Number),字符串类型(String),布尔类型(bool)

复杂数据类型:空类型(null),未定义类型(undefined),对象类型(Object)

29、介绍“ ”,null,undefind的区别

“ ”:是字符串类型的默认值,占用内存

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

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

30、介绍post和get的区别
post和get都是客户端用来提交数据的一种方式。
客户端将数据以报文的形式提交给服务器。

get 方法:【默认值】将数据附加在网址的后面进行传输
①以报文头的方式显示在URL地址栏中。
②所有出现文件名(URL)的地方都可以打开?进行get方式传值
③只能用来传输少量的数据
④在网址后面可以直接看到,不安全

post方法:不会附加在网址后面(隐形的传值)
①以报文体,报文内容的形式隐形的进行提交。
②post方式可以传大量数据(上传文件)
③隐形传输,非常安全

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

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

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

Const默认是静态的,Readonly如果设置为静态就必须进行显示声明。

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

int[]arr={45,23,1,2,99,34,7,3,56};
for(int i=0;i<arr.Length-1;i++)
{
    for(int j=0;j<arr.Length-i-1;j++)
    {
        if(arr[j]>arr[j+1])
        {
            int temp=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=temp;
        }
    }
}

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

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

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

//计算出重复的数字个数,然后减去获取不重复个数
int[]arr={1,1,3,5,6,7,2,3,3,5,5,6,6};
int count=0;
for(int i=0;i<arr.Length;i++)
{
    for(int j=i+1;j<arr.Length;j++)
    {
        if(arr[j]==arr[i])
        {
            count++;
            break;
        }
    }
}
Console.Write(arr.Length-count);

//直接计算不重复个数
int count2=arr.Length;
for(int i=0;i<arr.Length-1;i++)
{
    for(int j=i+1;j<arr.Length;j++)
    {
        if(arr[j]==arr[i])
        {
            count2--;
            i++;
        }
    }
}
Console.Write(count2);

35、说出B/S和C/S的区别

C/S(客户端服务) B/S(浏览器端服务)
(体积)胖客户端 瘦客户端
(效率)本地运行 服务器端运行
(网络)依赖不强 必须依赖网络
(用户)体验更好 其次

猜你喜欢

转载自blog.csdn.net/a_lllll/article/details/89419258