1.简述private、protected、public、internal修饰符的访问权限。
答:private:私有成员,在类的内部才可以访问;
protected:保护成员,该类内部和继承类中可以访问;
public:公共成员,完全公开,没有访问限制;
internal:当前程序集内可以访问。
2、面向对象的三个特性?
继承性:就是让一个类型的对象拥有另一个类型的对象的属性的方法。继承后,子类拥有父类的属性和方法。
封装性:就是将数据和代码捆绑在一起,防止外界干扰。
多态性:就是一个事物拥有不同形式的能力。
3.C#中的委托是什么?事件是不是一种委托?
答:委托可以把一个方法作为参数代入另一个方法。委托可以理解为指向函数的指针。事件不是委托,因为委托是类型,事件是对象。如果非要说事件和委托的关系,就是事件的内部是用委托实现的。
4.override与重载(overload)的区别
答:重载是方法的名称相同,参数或者参数类型不同,进行多次重载以适应不同的需要。重载是面向过程的;override是进行基类函数的重写,override是面向对象的。
5..net中类(class)与结构(struct)的异同?
答:class可以被实例化,属于引用类型,是分配在内存的堆上的,class可以实现接口和单继承其他类,还可以作为基类型;struct属于值类型,是分配在内存的栈上的,不能作为基类型,但是可以实现接口。
6.CTS、CLS、CLR分别作何解释?
答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。
7.什么是装箱和拆箱?
答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。
8.什么是受管制(托管)的代码?
答:托管代码是运行.NET公共语言运行时CLR的代码;unsafe:非托管代码,不经过CLR运行。程序员自行分配和释放内存空间。
9.在C#中,stringstr=null与stringstr=“”请尽量使用文字或图象说明其中的区别。
答:stringstr=null是不给他分配内存空间,而stringstr=""给它分配长度为空字符串的内存空间。
10、StringBuilder和String的区别?
String在进行运算时(如赋值、拼接等)会产生一个新的实例,而StringBuilder则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用StringBuilder,不要使用String。
11、GC是什么为什么要有GC
C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net中由GC进行垃圾回收像餐馆中店员去回收。
GC是垃圾收集器(GarbageCollection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。
12、值类型和引用类型的区别?
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含null值:然而,可空类型功能允许将null赋给值类型6。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
要请求垃圾收集,可以调用下面的方法:GC.Collect()一般不需要手动调用GC.Collect()。当一个对象没有任何变量指向(不再能使用)的时候就可以被回收了。
13、abstractclass和interface有什么区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类
14、能用foreach遍历访问的对象的要求?
15、在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
using引入名称空间或者使用非托管资源,使用完对象后自动执行实现了IDisposable接口的类的Dispose方法。
new新建实例或者隐藏父类方法。
16、什么是反射?
程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例。
17、进程和线程的区别?
进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源
18、堆和栈的区别?
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
19、ADO.net中常用的对象有哪些?分别描述一下
Connection数据库连接对象Command数据库命令DataReader数据读取器DataSet数据集
20、Application、Cookie和Session有什么不同?
Application是用来存取整个网站全局的信息,而Session是用来存取与具体某个访问者关联的信息。Cookie是保存在客户端的,机密信息不能保存在Cookie中,只能放小数据;Session是保存在服务器端的,比较安全,可以放大数据。
21、列举ASP.NET页面之间传递值的几种方式。
1.使用QueryString,如....id=1;response.Redirect()....
2.使用Session变量
3.使用Server.Transfer
4.Cookie传值
22、谈谈你对三层架构的理解
通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了“高内聚,低耦合”的思想。
表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候的所见所得。
业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等每层之间是一种垂直的关系。
三层结构是N层结构的一种,一般来说,层次之间是向下依赖的,下层代码未确定其接口(契约)前,上层代码是无法开发的,下层代码接口(契约)的变化将使上层的代码一起变化。
优点:分工明确,条理清晰,易于调试,而且具有可扩展性。
缺点:增加成本。
23、编写一个单例(Singleton)类?
把构造函数设置为private,设置一个public、static的对象实例
publicFileManager
{
privateFileManager(){}
publicreadonlystaticFileManagerInstance=newFileManager();
}
24、谈谈你对MVC和三层架构的理解?
三层架构即表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。表现层通俗讲就是展现给用户的界面,业务逻辑层即针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。数据访问层:该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
25、列举ASP.NetMVC中,从Action传值到View(不是从客户端传值到Action),有几种方式?
1、Viewdata2、Viewbag3、Model
26、在MVC中如何保持Sessions?
可使用tempdata、viewdata、viewbag三种方式。
其中tempdata:在不同的控制器或动作间转换时保持数据。另外,进行页面转向时,tempdata可以保持数据,它是一个内部的Session变量。
Viewdata:可以在控制器和视图间保持数据。
Viewbag:它是视图数据的动态包装,使用viewbag不需要类型转换,它使用的是内部动态关键词。
27、MVC中如何做输入验证?
在M层使用数据模型的属性标签形如[Required],在C层使用ModelState.IsValid属性检查数据是否正确,也可在C层使用JavaScript进行数据验证。
28、MVC有多少种不同类型的结果类型,请详细描述?
有12种,最主要的是ActionResult类,它是一个基础类,它有11个子类型。
ViewResult-给响应流渲染指定的视图
PartialViewResult-给响应流渲染指定的局部视图
EmptyResult-返回空的响应结果。
RedirectResult-执行一个HTTP转向到指定的URL。
RedirectToRouteResult-执行一个HTTP转向到一个URL,这个URL由基于路由数据的路由引擎来决定
JsonResult-序列化一个ViewData对像到JSON格式。
JavaScriptResult-返回一段javascript代码,它可以在客户端执行。
ContentResult-写内容到响应流,不需要视图支持。
FileContentResult-返回一个文件到客户端。
FileStreamResult-返回一个文件到客户端,它提供的是流。
FilePathResult-返回一个文件到客户端
29、JavaScript中的“==“和”===”区别?
==:判断两个变量是否相同,仅限于值,如果值相同而类型不同,那么JavaScript引擎会在内部做类型转换;
===:判断两个变量是否相同,无论是值还是类型,如果类型不同而值相同,也会返回false,而引擎不会在内部进行转换。
30、JavaScript中的“undefined、null”区别?
通俗地讲,undefined出现的原因是JavaScript引擎不知道这是个什么东西,而对于null,JavaScript引擎识别了它,但是没有被分配内存空间。
undefined的类型就是undefined,而null的类型是object。
31、简述javascript的作用域和闭包?
js变量的作用域是指:函数内定义的局部变量只在此函数内有效,而全局变量可以全局有效。
闭包的作用就在于能够改变局部变量的作用域,将值保存下来,但是如果使用不当会造成无法回收变量,引起性能问题,甚至崩溃。
32、不用中间变量交换两个变量?
inti=10;
intj=20;
Console.WriteLine("i={0},j={1}",i,j);
i=i+j;//i=30
j=i-j;//j=10;
i=i-j;//i=20;
33.请编程实现一个冒泡排序算法?
答:
publicstaticvoidBubbleSort(int[]array){if(array==null||array.Length==0)return;for(inti=0;i
staticvoidMain(string[]args){Foo(30);}publicstaticintFoo(inti){if(i<=0){return0;}elseif(i>0&&i<=2){return1;}else{returnFoo(i-1)+Foo(i-2);}}35.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
staticvoidMain(string[]args){int[]array=GenerateNums(100);}publicstaticint[]GenerateNums(intlength){int[]array=newint[length];ArrayListlist=newArrayList();Randomrandom=newRandom();while(list.Count 答:解1:selecttop10*fromAwhereidnotin(selecttop30idfromA) 解2:selecttop10*fromAwhereid>(selectmax(id)from(selecttop30idfromA)asA) 37、索引的作用?和它的优点缺点是什么? 索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 38、什么是事务?什么是锁? 事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 39、什么叫视图?游标是什么? 视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要 40、触发器的作用? 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 41、什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。 42、横表、纵表转换 纵表结构TableA Name Course Grade 张三 语文 75 数学 80 英语 90 李四 95 55 横表结构TableB 0 先理解: selectName, (caseCoursewhen‘语文‘thenGradeelse0end)as语文, (caseCoursewhen‘数学‘thenGradeelse0end)as数学, (caseCoursewhen‘英语‘thenGradeelse0end)as英语 fromTableA 然后理解标准答案: sum(caseCoursewhen‘语文‘thenGradeelse0end)as语文, sum(caseCoursewhen‘数学‘thenGradeelse0end)as数学, sum(caseCoursewhen‘英语‘thenGradeelse0end)as英语 groupbyName 横表转纵表的"SQL"示例 横表结构:TEST_H2Z ID姓名语文数学英语 1张三809070 2李四908595 3王五887590 转换后的表结构: ID姓名科目成绩 1张三语文80 2张三数学90 3张三英语70 4李四语文90 5李四数学80 6李四英语99 7王五语文85 8王五数学96 9王五英语88 横表转纵表SQL示例:SELECT姓名,'语文'AS科目,语文AS成绩FROMTEST_H2ZUNIONALLSELECT姓名,'数学'AS科目,数学AS成绩FROMTEST_H2ZUNIONALLSELECT姓名,'英语'AS科目,英语AS成绩FROMTEST_H2ZORDERBY姓名,科目DESC; 43、删除姓名、年龄重复的记录 Idnameagesalary 1yzk801000 2yzk802000 3tom2020000 4tom2020000 5im2020000 //取得不重复的数据 select*fromPersonswhereIdin(SELECTMAX(Id)ASExpr1FROMPersonsGROUPBYName,Age) 根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。 删除重复的数据: deletefromPersonswhereIdnotin(SELECTMAX(Id)ASExpr1FROMPersonsGROUPBYName,Age) 44.假设数据库中有User和Income两张表如下,请仔细分析下方的示例数据,然后写出SQL,得到右方的查询结果。 答:selectName,Year,Month,Incomefrom(selectUserId,Year,Month,Sum(Amount)IncomefromIncomegroupbyUserId,Year,Month)Ajoin[User]onA.UserId=[User].Id 45.现有如下实体类: publicclassUser{publicintId{get;set;}publicstringName{get;set;}}publicclassIncome{publicintId{get;set;}publicintUserId{get;set;}publicdecimalAmount{get;set;}publicintYear{get;set;}publicintMonth{get;set;}}publicclassUserIncomeDto{publicstringName{get;set;}publicintYear{get;set;}publicintMonth{get;set;}publicdecimalIncome{get;set;}}请用LINQ的方式得到上一题的查询结果。 publicList