面试题

一、基础知识

1、在.NET中所有类的基类是?
object
2、C#中有没有静态构造函数,如果有是做什么用的?
有;
静态构造函数用于初始化类。典型用途是:可以用于写入日志。

3、面向对象语言的3个特性。
封装、继承、多态

5、什么是反射?
程序运行时将exe、dll文件加载到内存并执行一些操作的过程,这个过程称为反射。
7、override(重写)与overload(重载)的区别?
overload(重载):方法名称相同,参数个数或者类型不同。
override(重写):是子类覆盖父类中的方法,要求方法名、参数、返回值完全相同,连访问修饰也为可访问级别。

8、C#中的委托是什么?事件是不是一种委托?
委托可以把一个方法作为参数代入另一个方法。
可以理解为指向一个函数的引用。
是,是一种特殊的委托
public delegate void OnMsg(string s);
void onMsg(string str)
{
MessageBox.Show(str);
}
OnMsg msg = new OnMsg(onMsg);
msg(“TEST”);

9、什么是强类型,什么是弱类型?
强类型:每个变量和对象都必须具有声明类型,且在执行时类型不能更改。
弱类型:在执行的时候才会确定类型。
C# 是强类型语言;因此每个变量和对象都必须具有声明类型。
javascript是弱类型语言;因此它可以用var来定义所有变量;

10、C#中接口和类的异同?
相同点:
接口和类都可以被继承。

不同点:
接口不能直接实例化、接口不包含方法的实现、接口可以多继承,类只能单继承。

11、abstract class(抽象类)和interface(接口)有什么区别?
相同点:
(1) 都可以被继承
(2) 都不能被实例化
(3) 都可以包含方法声明
不同点:
(1) 接口可以多继承,抽象类只能单继承。
(2) 继承接口的子类必须实现该接口的全部成员,抽象类可不用实现全部方法。
(3) 接口可以用于支持回调,而继承并不具备这个特点。

12、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。
抽象类可以实现接口。
抽象类可继承实体类,但前提是实体类必须有明确的构造函数。

13、是否可以继承String类?
String类是密封类故不可以继承。

14、C#的两种类据类型:值类型和引用类型。
概念:值类型直接存储其值,而引用类型存储对其值的引用
值类型: byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。
引用类型: string 和 class统称为引用类型。

值类型变量声明后,不管是否已经赋值,编译器都为其分配内存。
引用类型的对象是动态分配内存。
引用类型的对象总是在进程堆中分配(动态分配)。
15、string和String的区别?
使用上没有区别。语义上略有区别
string是c#语言的一部分;String是.net框架的一个类。

string 是c#语言的关键字,是语言的一部分,
String 是.net框架的System.String类,是框架的一个类。
使用时C#的string会自动等同于System.String。
16、什么是装箱和拆箱,举例说明。
装箱是指把值类型转换成引用类型的过程,例如 int i=10; object obj=i; int转换为object
拆箱是指把引用类型转换成值类型的过程,例如 int j=(int)obj; object转换为 int

17、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String没有length()这个方法,有length属性。
18、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

short s1 = 1; s1 = s1 + 1;有错
s1是short型,s1+1是int型,不能显式转化为short型。
可修改为s1 =(short)(s1 + 1)。

short s1 = 1; s1 += 1正确。

19、as 运算符的作用是什么?
用于执行引用类型的显式类型转换。 object 转换为class
如果要转换的类型与指定类型兼容,转换就会成功;如果类型不兼容,则返回null。

20、在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
using作为指令,用作引入命名空间。作为语句可以自动释放内存资源;
new 实例化一个对像,或修饰一个方法,表此方法完全重写此方法.

21、new 关键字用法?
实例化一个对像;或修饰一个方法,表此方法完全重写此方法。

22、请列出c#中几种循环的方法,并指出他们的不同?
do while:不管符不符合条件都会运行一次,在运行一次在之后再进行判断是否符合条件。
while:首先判断是否符合条件在进行运行。
for:一般需要定义局部性控制循环的的变量使用。
foreach:只能对数据进行读;在其作用域内不能对进行遍历的值做修改,其遍历顺序只能递增而且其控制循环变量是默认的只能++;

23、WebService的介绍及好处?
WebService服务可以描述为可以在web上部署并可以被任何应用程序或其他服务调用的功能。
所谓服务就是系统提供一组接口,并通过接口使用系统提供的功能,WebService服务可以提供任何企业到客户,企业到企业,点对点或部门对部门通讯所需的服务,比如一个公司可以通过网络连接到另一个公司的服务,从而直接传递订购单。
特点:
1、可利用HTTP,穿透防火墙的通信。
2、应用程序集成
3、B2B的集成
4、软件和数据重用

24、WCF和WebService的区别?
1、WCF不依赖于IIS。
2、WCF可以配置BasicHttpBinding来兼容WS。
3、WCF可以基于TCP或 消息队列(MessageQueue)来传输数据。
4、WCF可以使有状态的并且支持事务。
5、WCF 支持多种通信协议 Http/Https 、TCP/UDP、MSMQ、命名管道、对等网、消息可达性、事务流等。
6、WCF支持多种消息传输格式Text,JSON,Motom,Binary
7、WCF 支持多种会话模式:单向、双向、请求/响应。
8、WCF 支持 WAS hosting、Windows 服务 hosting、Self-Hosting、IIS hosting 等。
9、WCF 支持多种并发模式:单例、单调、会话 。

25、简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
webservice主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

26、什么是XML?XML举例用法。
XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言;
可用于:配置文件、数据存储、数据传输。

27、什么是json?Json举例用法。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格局。
可用于:数据存储、网站数据交互传输。

28、JSON 和 XML 的比较。
1.JSON和XML的数据可读性根本相同
2.JSON和XML相同具有丰富的解析手法
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML

29、 简述 private、 protected、 public、 internal 修饰符的访问权限
private :私有成员, 在类的内部才可以访问。
protected :保护成员,该类内部和继承类中可以访问。
public:公共成员,完全公开,没有访问限制。
internal:在同一命名空间内可以访问。

30、C#中static的作用?

标记为static的就不用创建实例对象调用了,可以通过类名直接点出来。
static可修饰类、字段、属性、方法。

31、简述枚举的作用?
枚举可以避免不合理的赋值,它表示一组有限的值,对可能的值进行约束。
枚举可以使代码更易于维护、枚举使代码更清晰、枚举使代码更直观方便。

32、为什么在C#中我们不担心内存漏洞?
因为C#中的内存管理机制,是采用垃圾回收机制来管理内存的。

33、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小

34、进程和线程的区别?
进程是系统进行资源分配和调度的单位;
线程是CPU调度和分派的单位;
一个进程可以有多个线程,这些线程共享这个进程的资源。

35、C#中有哪些常见异常?
基类Exception、与参数有关的异常类、与数组有关的异常、与IO有关的异常、与算术有关的异常

36、.net中读写数据库需要用到那些类?他们的作用?
DataSet:数据集。
DataCommand:执行语句命令。
DataAdapter:数据的集合,用语填充。
DataReader:数据只读器

37、软件开发过程一般有几个阶段?每个阶段的作用?
需求分析,架构设计,代码编写,QA(质量保证、测试运行),部署上线
38、.net的错误处理机制是什么?
采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。
try{可能要出错的代码}catch{出错后如何处理}finally{不论是否出错都要执行}

39、谈谈final,finally和finalize的区别?
final是修饰符
如果用来修饰类的话,该类不能作为父类被继承;
如果用来修饰变量的话,该变量只能读取不能修改,且要赋初定值;
如果用来修饰方法的话,不能给重载;

Finally 是异常处理最后的执行块,需要配合try catch语句使用;

finalize(_)是一个方法名,是在垃圾收集器删除对象之前调用的对象;

二、开发网站相关的知识:

40、ASP.NET页面之间传递值的几种方式?
QueryString:简单,显示于地址栏,长度有限
Session:简单,但易丢失
Cookies:简单,但可能不支持,可能被伪造(不安全)

Application:全局
数据库:稳定,安全,但性能相对弱

41、ASP.NET MVC Controller向View传值有几种方式,简单说明。
分别有:ViewData、ViewBag、TempData 等

ViewData是字典类型,mvc1就有了,赋值方式用字典方式,通过key值读取对应的value,ViewData[“myName”]
ViewBag是动态类型,mvc3才有,使用时直接添加属性赋值即可ViewBag.myName=”name”
ViewBag和ViewData只在当前界面中有效
ViewData和ViewBag中的值可以互相访问,因为ViewBag的实现中包含了ViewData
viewData比viewBag快

42、Session有什么重大BUG,微软提出了什么方法加以解决?
由于IIS的进程回收机制,系统繁忙时会导致Session会话丢失;
可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的结束(END)事件。

43、.NET MVC框架介绍。
MVC是一种架构设计模式
MVC由三部分组成:Model(模型)、View(视图)及Controller(控制器)。

Model即应用程序的数据模型
View是应用程序的界面
Controller 定义了程序的应用逻辑

44、javascript中const,var,let区别?
const定义的变量不可以修改,而且必须初始化。
var定义的变量可以修改,如果不初始化会输出undefined,不会报错。
let是块级作用域,函数内部使用let定义后,对函数外部无影响。

45、javascript中typeof返回哪些数据类型
  undefined
  string
  boolean
  number
  Object
Function
  symbol(ES6)

46、javascript中例举3种强制类型转换和2种隐式类型转换?
强制类型转换:
Number()
toString()
Boolean()
隐式类型转换:
+和-

三、深一点的知识

47、什么叫做SQL注入,如何防止?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。
防范:输入的内容构造SQL命令之前,就过滤sql关键字、在后台执行sql语句之前也过滤检测sql命令关键字、使用存储过程参数化防范。

48、泛型的作用?
储存特定的数据类型,在编译阶段检查数据类型正确性。当前存入的数据是什么类型就以什么类型存储,不会转换为Object类型存储,不需要装箱操作。

泛型可以用来解决用同一个方法来处理传入不同类型参数的办法。

特点:
1、代码重用。
2、性能更佳,能够避免装箱和拆箱操作。
3、类型安全。

泛型有三种:泛型类、泛型方法、泛型接口;

49、什么是单例模式?
单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,只会实例化一次。

50、什么是简单工厂模式?
简单工厂模式就是根据传入参数的不同创建不同的类的对象
优点:
  1.简单工厂可以有效地降低客户端和具体对象的耦合,将new具体对象的任务交给了一个简单工厂类。
  2可以有效的进行代码复用。
缺点:
一定程度上违背了开闭原则,在新增产品时需要修改简单工厂类。

51、什么是工厂方法模式?
工厂方法模式之所以可以解决简单工厂模式的缺点,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点。

52、.NET 托管代码和非托管代码的区别
什么是托管代码(managed code)?
托管代码是一microsoft的中间语言(IL),他主要的作用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的作用,源代码在运行时分为两个阶段:
1.源代码编译为托管代码,(所以源代码可以有很多种,如VB,C#,J#)
2.托管代码编译为microsoft的平台专用语言。
编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含 了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。
托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确 性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码,然后会把编译好的机械码缓存起来,以备下次调用。(这就是即时编译) 随着程序集的运行,运行库会持续地提供各种服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应 用程序行为。
Visual Basic .NET和C#只能产生托管代码。如果你用这类语言写程序,那么所产生的代码就是托管代码。如果你愿意,Visual C++ .NET可以生成托管代码。当你创建一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。
什么是非托管代码(unmanaged code)?
非托管代码就是在Visual Studio .NET 2002发布之前所创建的代码。例如Visual Basic 6, Visual C++ 6, 最糟糕的是,连那些依然残存在你的硬盘中、拥有超过15年历史的陈旧C编译器所产生的代码都是非托管代码。托管代码直接编译成目标计算机的机械码,这些代 码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理 等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用Windows SDK所提供的API来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。
跟Visual Studio平台的其他编程语言不一样,Visual C++可以创建非托管程序。当你创建一个项目,并且选择名字以M FC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
区别:
1、托管代码是一种中间语言,运行在CLR上;
非托管代码被编译为机器码,运行在机器上。
• 1
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;
非托管代码依赖于平台和语言。
• 1
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;
非托管代码需要自己提供安全检测、垃圾回收等操作。

四、算法知识
53、一列数的规则如下: 1、1、2、3、5、8、13、21、34…求第30位数是多少,用递归算法实现。

Public int fib(int n) {
if (n1||n2) {
return 1;
} else {
return fib(n-1)+fib(n-2);
}
}
int i=fib(30);

54、请编程实现一个冒泡排序算法?

int[] ints={1, 3, 5, 7, 90, 2, 4, 6, 8, 10};
for (int i = 0; i < ints.Length - 1; i++)
{
for(int j=0;j<ints.Length-1-i;j++)
{
if (ints[j] > ints[j + 1])
{
int temp = ints[j];
ints[j]=ints[j+1];
ints[j + 1] = temp;
}
}
}

55、请编程实现一个选择排序算法?

    int[] arr = [11, 8888, 3, 4, 5, 6, 7, 8];

    for (int i = 0; i < arr.Length-1; i++) {
        for (int j = i+1; j < arr.Length; j++) {
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;                  
            }
        }
    }

五、数据库知识

56、SQL的四种连接-左连接、右连接、内连接、全连接
(1) 内连接:inner join 或 join ,显示左右表共有的数据。
(2) 左连接:left join或left outer join,左连接就是以左表为准,去匹配右表,左表有多少 条数据,结果就是多少条数据。
(3) 右连接:right join或 right outer join,右连接就是与左连接反之,以右表为准,去匹配左表,右表有多少条数据,结果就是多少条数据。
(4) 全连接:full join或 full outer join,全连接数据条数不一定,相当与是左连接和右连接的总和。

57、.用一条SQL 语句 查询出每门课都大于80 分的学生姓名
name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90

select distinct name from table
where fenshu>80

select name from table
where fenshu>80
group by name

59、 学生表 如下:
自动编号 学号 姓名 课程编号 课程名称 分数
1 2005001 张三 0001 数学 69
2 2005002 李四 0001 数学 89
3 2005001 张三 0001 数学 69
删除除了自动编号不同, 其他都相同的学生冗余信息

delete tablename where 自动编号 not in(select min(自动编号) from tablename group by学号, 姓名, 课程编号, 课程名称, 分数)

60、学生表 ,学号是唯一的。编写一条sql语句条件要求:排序要求:学生名称 升序、性别 升序、地址 倒序。取出第二行2至第四4 行的数据。

Name number sex address
张三 001 男 广州
李四 002 男 广西
小红 003 女 北京
张三 004 男 上海
小明 005 男 广州
小明 006 男 茂名

select * from (
select *,
(ROW_NUMBER() over (order by Name,sex,address desc))as RowsIndex
from 学生表
)as db
where RowsIndex>=2 and RowsIndex<=4

分页结果:

第二行2至第四4 行的数据

61、SQLSERVER树型结构表A(Id int, ParentId int,Name nvarchar(50))查询Id为500所有父级的脚本?

with cte as
(
select * from A where id=500
union all
select a.* from A a join cte b on a.id=b.ParentId
)
select * from cte

62、SQLSERVER中varchar、nvarchar的区别,请写出创建表名为【table1】,带一个字段名为【中文】,类型为nvarchar,并插入一条数据为【我是中国人】(避免乱码情况)的脚本?
varchar是使用单字节来存储数据的
nvarchar是使用Unico来存储数据的。
varchar长度是 1 到 8000 之间。
nvarchar长度是 1 到 4000 之间;
nvarchar处理Unicode码;

create table table1 (中文 nvarchar(50) null)
insert into table1(中文) values(N’我是中国人’)

63、什么是事务?什么是锁?
事务:
事务是指一个工作单元,它包含了一组数据操作命令,并且所有的命令作为一个整体一起向系统提交或撤消请求操作,即这组命令要么都执行,要么都不执行。

锁:
 锁是在多用户环境中对数据的访问的限制。
SqlServer自动锁定特定记录、字段或文件,防止用户访问,以维护数据安全或防止并发数据操作问题,锁可以保证事务的完整性和并发性。

64、什么是索引,有什么优点?
索引就如同字典的音序表、字形表,用来提高查询的速度。

65、视图是什么?游标是什么?
视图: 视图是一种虚拟表、
视图通常是一个或多个表的行或列的子集、
视图的结果更容易理解
视图获取数据更容易。
游标:
游标用于按顺序遍历结果集,可以对结果集进行修改。

66、什么是存储过程?有什么优点?
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集。
优点:提高查询速度,减轻网络压力。

67、什么是触发器?
触发器是一种特殊类型的存储过程,出发器主要通过事件触发而被执行的。
比如:触发器是对表进行插入、更新、删除的时候会自动执行的特殊存储过程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值