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#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。
10、StringBuilder 和 String 的区别?
String 在进行运算时(如赋值、拼接等)会产生一个新的实例,而 StringBuilder 则不会。所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用 StringBuilder,不要使用 String。
如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的
11、GC是什么? 为什么要有GC?
C/C++中由程序员进行对象的回收像学校食堂中由学生收盘子,.Net中由GC进行垃圾回收像餐馆中店员去回收。
GC是垃圾收集器(Garbage Collection)。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。GC只能处理托管内存资源的释放,对于非托管资源则不能使用GC进行回收,必须由程序员手工回收,一个例子就是FileStream或者SqlConnection需要程序员调用Dispose进行资源的回收。
12、值类型和引用类型的区别?
1.将一个值类型变量赋给另一个值类型变量时,将复制包含的值。引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
2.值类型不可能派生出新的类型:所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3.值类型不可能包含 null 值:然而,可空类型功能允许将 null 赋给值类型6。
4.每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
要请求垃圾收集,可以调用下面的方法:GC.Collect()一般不需要手动调用GC.Collect()。当一个对象没有任何变量指向(不再能使用)的时候就可以被回收了。
13、abstract class和interface有什么区别?
相同点:
都不能被直接实例化,都可以通过继承实现其抽象方法。
不同点:
接口支持多继承;抽象类不能实现多继承。
接口只能定义行为;抽象类既可以定义行为,还可能提供实现。
接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;
抽象类可以定义字段、属性、包含有实现的方法。
接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类
14、能用foreach遍历访问的对象的要求?
需要实现IEnumerable接口或声明GetEnumerator方法的类型。
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的对象实例
public FileManager
{
private FileManager(){}
public readonly static FileManager Instance = new FileManager();
}
24、谈谈你对MVC和三层架构的理解?
MVC即模型、视图、控制器,模型表示业务数据及业务处理,用来封装数据及行为;视图是用户看到并与之交互的界面;控制器接受用户输入并调用模型和视图去完成用户的请求。使用MVC有利于关注点分离,自动化UI测试成为了可能。
三层架构即表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。表现层通俗讲就是展现给用户的界面,业务逻辑层即针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。数据访问层:该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
25、列举ASP.Net MVC中,从Action传值到View(不是从客户端传值到Action),有几种方式?
1、Viewdata 2、Viewbag 3、Model
可使用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、不用中间变量交换两个变量?
int i = 10;
int j = 20;
Console.WriteLine("i={0},j={1}", i, j);
i = i + j;//i=30
j = i - j;//j=10;
i = i - j;//i=20;
Console.WriteLine("i={0},j={1}", i, j);
33.请编程实现一个冒泡排序算法?
答:
public static void BubbleSort(int[] array) { if (array == null || array.Length == 0) return; for (int i = 0; i < array.Length; i++) { for (int j = 0; j < array.Length - 1 - i; j++) { if(array[j]>array[j+1]) { int temp = array[j]; array[j] = array[j + 1]; array[j + 1] = temp; } } } }
34. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。
答:
static void Main(string[] args) { Foo(30); }
public static int Foo(int i) { if (i <= 0) { return 0; } else if (i > 0 && i <= 2) { return 1; } else { return Foo(i - 1) + Foo(i - 2); } }
35.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
static void Main(string[] args) { int[] array = GenerateNums(100); } public static int[] GenerateNums(int length) { int[] array = new int[length]; ArrayList list = new ArrayList(); Random random = new Random(); while(list.Count < length) { int num = random.Next(1, length + 1); if(!list.Contains(num)) { list.Add(num); } } for (int i = 0; i < length; i++) { array[i] = (int)list[i]; } return array; }
36.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的)
答:解1: select top 10 * from A where id not in (select top 30 id from A)
解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A)
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
38、什么是事务?什么是锁?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
锁:锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。
39、什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要
40、触发器的作用?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
41、什么是SQL注入式攻击?
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。
42、横表、纵表转换
纵表结构 TableA
Name |
Course |
Grade |
张三 |
语文 |
75 |
张三 |
数学 |
80 |
张三 |
英语 |
90 |
李四 |
语文 |
95 |
李四 |
数学 |
55 |
横表结构 TableB
Name |
语文 |
数学 |
英语 |
张三 |
75 |
80 |
90 |
李四 |
95 |
55 |
0 |
先理解:
select Name,
(case Course when ‘语文‘ then Grade else 0 end) as 语文,
(case Course when ‘数学‘ then Grade else 0 end) as 数学,
(case Course when ‘英语‘ then Grade else 0 end) as 英语
from TableA
然后理解标准答案:
select Name,
sum(case Course when ‘语文‘ then Grade else 0 end) as 语文,
sum(case Course when ‘数学‘ then Grade else 0 end) as 数学,
sum(case Course when ‘英语‘ then Grade else 0 end) as 英语
from TableA
group by Name
横表转纵表的"SQL"示例
横表结构: TEST_H2Z
ID 姓名 语文 数学 英语
1 张三 80 90 70
2 李四 90 85 95
3 王五 88 75 90
转换后的表结构:
ID 姓名 科目 成绩
1 张三 语文 80
2 张三 数学 90
3 张三 英语 70
4 李四 语文 90
5 李四 数学 80
6 李四 英语 99
7 王五 语文 85
8 王五 数学 96
9 王五 英语 88
横表转纵表SQL示例:
SELECT 姓名,'语文' AS 科目,语文 AS 成绩 FROM TEST_H2Z UNION ALL
SELECT 姓名,'数学' AS 科目,数学 AS 成绩 FROM TEST_H2Z UNION ALL
SELECT 姓名,'英语' AS 科目,英语 AS 成绩 FROM TEST_H2Z
ORDER BY 姓名,科目 DESC;
43、删除姓名、年龄重复的记录
Id name age salary
1 yzk 80 1000
2 yzk 80 2000
3 tom 20 20000
4 tom 20 20000
5 im 20 20000
//取得不重复的数据
select * from Persons where Id in(SELECT MAX(Id) AS Expr1 FROM PersonsGROUP BY Name, Age)
根据姓名、年龄分组,取出每组的Id最大值,然后将Id最大值之外的排除。
删除重复的数据:
delete from Persons where Id not in(SELECT MAX(Id) AS Expr1 FROM Persons GROUP BY Name, Age)
44.假设数据库中有User和Income两张表如下,请仔细分析下方的示例数据,然后写出SQL,得到右方的查询结果。
答:select Name,Year,Month,Income from(select UserId,Year,Month,Sum(Amount) Income from Income group by UserId,Year,Month)A join [User] on A.UserId = [User].Id
45.现有如下实体类:
public class User { public int Id { get; set; } public string Name { get; set; } } public class Income { public int Id { get; set; } public int UserId { get; set; } public decimal Amount { get; set; } public int Year { get; set; } public int Month { get; set; } } public class UserIncomeDto { public string Name { get; set; } public int Year { get; set; } public int Month { get; set; } public decimal Income { get; set; } }
请用LINQ的方式得到上一题的查询结果。
public List<UserIncomeDto> GetUserIncomeDtos(List<User> users, List<Income> incomes) { var query1 = from income in incomes group income by new { income.UserId, income.Year, income.Month } into g select new { g.Key.UserId, g.Key.Year, g.Key.Month, Income = g.Sum(s => s.Amount) }; var query2 = from income in query1 join user in users on income.UserId equals user.Id select new UserIncomeDto() { Name = user.Name, Year = income.Year, Month = income.Month, Income = income.Income }; return query2.ToList(); }