1.说明值类型与引用类型的区别?
值类型:
①存储在栈中,调用速度快
②派生自System.ValueType
③直接存储的是数据值
④内存由系统进行自动释放
⑤值类型包含结构体(数值类型、bool型、用户定义的结构体),枚举,可空类型
引用类型
①存储在堆中,调用速度慢
②派生自System.Object
③存储对其值的引用位置
④内存由GC来自动释放
⑤引用类型包含:class、数组、interface 或 delegate、object、string 和 dynamic
2.简述c#访问修饰符的作用?
public(公开的)
所有类的类成员
访问权限:不受任何限制
private(私有的)
所有类或类成员使用
访问权限:只能在本类中访问
protected(受保护的)
应用给类和内嵌类的所有成员
访问权限:当前类及子类
internal
应用给类和内嵌类的所有成员
访问权限: 应用于同一程序集中
internal protected/ protected internal
应用给类和内嵌类的所有成员
访问权限:应用于同一程序集和子类中
3.ADO.NET的五个主要对象?
DataConnection:连接数据库
DataCommand:对数据库执行命令操作
DataReader:只需要循序的读取数据而不需要其他操作
DataAdapter:适配器,在数据源和DataSet之间执行数据传输工作
DataSet:数据存储器,视为一个暂存区,可以把从数据库中所查询到的数据保留起来
4.c#中的委托是什么?事件是不是委托?事件和委托的关系?
委托是一个类,它定义了方法的类型,使得可以将方法作为另一个方法的参数进行传递。
事件是一种引用类型,实际上是一种特殊的委托,事件是对委托的高度封装
5.重写和重载,ref和out的区别是什么?
重载:方法名相同,参数列表不同(参数个数,参数类型)
重写:当一个子类继承一个父类,而子类中的方法与父类中的方法名,参数个数,参数类型都完全一致时,就称子类中的这个方法重写了父类中的这个方法。
区别:重载编译时多态,重写运行时多态,重载不需要继承,重写必须继承
ref(引用传参)和out(输出参数)的区别:
相同点:
(1)两者都是用来修饰参数
(2)在定义和调用方法是都必须带上各自的关键字ref或out
不同点:
(1)ref必须在调用前进行初始化,而out必须在方法体内进行初始化
(2)ref有进有出,out只出不进
(3)ref则用在需要被调用的方法修改调用者的引用的时候,而 out适合用在需要retrun多个返回值的地方
6.c#中的索引器是否只能根据数字进行索引?是否允许多个索引器参数?
索引器不只是根据数字进行索引的,参数的个数和类型都是任意的。
索引可以有多个参数,参数类型任意
7.属性和public字段的区别是什么?调用set设置的一个属性值,使用get方法读取到的值一定是set设置进去的吗?
属性可以对设置值、获取值的过程进行非法值控制,比如年龄禁止设值负数,而字段则不能进行这样的设置。
虽然一般情况下get读取的值就是set设置的值,但是可以让get读取的值不是set设置的值的。
8.简述拆箱和装箱?
装箱:从值类型转换到引用类型。
String i=
"abc"
;
object
obj=(
object
)i;
拆箱:从引用类型转换到值类型, 前提是装箱
object
obj=
"abc"
;
string
i=(
string
)obj;
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注入
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.详细描述T-SQL语言包含哪三种常用语言?
①、数据操纵语言(DML):SQL允许用户或应用程序通过添加新数据、删除旧数据和修改以前存储的数据对数据库进行更新,用来操纵数据库数据命令。
②、数据定义语言(DDL):SQL让用户定义存储数据的结构和组织,以及数据项之间的关系。用来建立数据库、数据库对象和定义列命令。
③、数据控制语言(DCL):可以使用SQL来限制用户检索、添加和修改数据的能力,保护存储的数据不被未授权的用户所访问,用来控制数据库组件存取、权限等命令。
24.请描述Socket进行同步通讯编程的详细步骤?
服务器端:
第一步:创建一个用于监听连接的Socket对象;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对象;
第三步:用socket对象的Bind()方法绑定EndPoint;
第四步:用socket对象的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对象的Accept()方法创建一个新的用于和客户端进行通信的socket对象;
第六步:通信结束后一定记得关闭socket;
客户端:
第一步:建立一个Socket对象;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对象;
第三步:用socket对象的Connect()方法以上面建立的EndPoint对象做为参数,向服务器发出连接请求;
第四步:如果连接成功,就用socket对象的Send()方法向服务器发送信息;
第五步:用socket对象的Receive()方法接受服务器发来的信息 ;
第六步:通信结束后一定记得关闭socket;
25.详细说明三层架构?
数据访问层,业务层,表示层。
数据访问层(DAL)主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作
业务逻辑层(BLL)对传送数据进行逻辑判断分折,并进行传送正确的值。
表示层(UI)为了与用户交互的界面。
UI–BLL–DAL–BLL–UI
三层架构的优点:
①开发人员可以只关注结构中的某一层
②可以轻易用新的实现来替换原有层次的实现
③降低层与层之间的依赖
④有利于标准化
⑤有利于各层逻辑的复用
⑥结构更明确
⑦降低维护成本和维护时间
26.存储过程作用是什么?
①加快系统的运行速度
②封装复杂操作
③实现代码重用
④增强安全性
⑤减少网络流量
27.JS基本数据类型是什么?
JS基本数据类型分为两大类:简单数据类型和复杂数据类型
简单数据类型:数字类型(Number),字符串类型(String),布尔类型(bool)
复杂数据类型:空类型(null),未定义类型(undefined),对象类型(Object)
28.介绍” “,null,undefined的区别?
“ ”:是字符串类型的默认值,占用内存
null:null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。转换为值返回0.
undefined:当声明的变量还未被初始化时,变量的默认值为undefined。转换为值返回NAN
29.介绍post和get的区别?
相同点:都是提交表单的方式,通过客户端一报文的形式提交给服务端
不同点:
post提交以报文头的方式显示到URL地址中,安全性较高
get提交以报文体的方式显示到URL地址中,安全性低
30.简述const和readonly的区别?
Readonly表示只读,定义的时候可以不用初始化,可以延迟到构造方法中进行初始化。
Const表示常量,定义的时候就要初始化。
Const默认是静态的,Readonly如果设置为静态就必须进行显示声明。
31.简述B/S和C/S的区别?
32.使用算法实现冒泡排序?
int[] arr = new int[5] { 10, 6, 96, 25, 38 };
for (int i = 0; i < arr.Length - 1; i++)
{
for (int j = 0; j < arr.Length - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + ",");
}
33.使用算法求出斐波那契数列?
static void Main(string[] args)
{
//斐波那契数列0,1,1,2,3,5,8,13,21.....
Console.WriteLine("请输入需要计算的斐波那契数列的位数");
int i = int.Parse(Console.ReadLine());
int result = GetRes(i);
Console.WriteLine("求出斐波那契数列第{0}位是{1}",i,result);
Console.ReadLine();
}
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.使用算法实现从一个数组中求出不重复数字的个数?
int[] array1 = new int[] {1,2,3,4,5,2,3,4,5,6,7,8,2,5,9};
int length = array1.Length;
for (int i = 0; i < array1.Length-1; i++)
{
for (int j = i+1; j < array1.Length; j++)
{
int num = array1[i];
if (array1[j]==num)
{
//如果出现重复,数组长度-1
length--;
i++;
}
}
}
Console.WriteLine("不重复的数字总个数为:" + length);