.net 面试题
1.用户访问mvc的过程
用户在请求之后首先会进入管道,然后在管道的第七个事件(Post Resolve Request Chace)中执行MvcHandler进行路由创建,并判断路由的配置(UrlRoutingModel类),之后在第八个事件根据用户的请求路径(url)创建对应的页面,然后进入对应页面的控制器,执行了这个控制器中的代码后,最终返回控制器对应的ActionResult
2.WebApi 作用
webapi是一种比较像restful风格的轻量级框架,它提供了比较完整的http请求支持,主要用来做开放API,并且还可以对前端和后台进行解耦,让前端更加灵活
3.数据库碎片是什么
碎片就是在访问一个表时,造成了比正常情况更多的磁盘IO操作或更长的磁盘IO操作
碎片分为逻辑/物理磁盘碎片和索引碎片
逻辑碎片
逻辑碎片是在文件系统里数据库文件的碎片
产生原因和造成的后果
数据库和其他文件放在一个磁盘,导致系统没法给数据库文件分配连续的空间,从而产生。这样会造成磁头在读取数据库文件时需要来回移动
数据库文件频繁的以小块增长大小,也会造成逻辑碎片。所以创建数据库文件时估量好大小,分配足够的空间,避免频繁的增长 或者 指定数据库以大块增长不是频繁的小块增长
索引碎片
索引碎片如果比较高的话,优化器将不能最优的使用索引
索引碎片又分为 内部碎片 和 外部碎片
内部碎片
内部碎片是根据每个索引页的饱和度来衡量的(页密度),如果一个索引页能100%存满,那么它就不存在内部碎片,换而言之就是说,内部碎片在索引页的可用空间中产生,一般由install,delete,update等DML(data manipulation language)语句操作造成
每个页都有一定的大小用来保存数据,但是并不能保证每个页都可以占满,例如一个页的大小为750,一条数据大小为100,那么750/100,这个页就只可以存7条数据,剩下的50空间,因为不足以容纳一条数据,所以只能空着,然后开辟一个新的页去继续储存数据
然后我们随便删除一半的数据就会变成这样
可以看到有大范围的空位置,留下的数据有7条,完全可以通过一个页来保存,但是实际我们用的三个页。
这就会造成查询时,原本读取一个页就可以,但是现在要读取三个页,增加了IO操作。
内部碎片还会让缓存和数据库文件占用更大的空间,用来存储额外的页
外部碎片
外部碎片是页的逻辑顺序和物理顺序不一致造成的
如果像下图这样顺序一致的数据的话,就不会有外部碎片产生
不过我们可以看到第一页中少了一个5,现在我们要向里面插入5,这时因为第一页空间已经占满了,不能再放数据,就只能把第一页拆开,一半数据在第一页,一半数据在新的页(第三页)
如果是使用where之类的有详细条件的查询或无序查询时,外部碎片不会造成影响,但是在进行有序查询时,磁头就需要在不同页中来回跳,从而降低了性能
4.如何解决碎片
1.删除索引进行重建
这是对整理索引最有效的方式,但并不好用,因为在删除期间,索引不可用,会导致阻塞的发生,而且删除聚集索引时会导致非聚集索引重建两次(删除时一次,创建时一次)
2.使用DROP_EXISTING语句重建索引
因为这个语句是原子性的,所以不会导致非聚集索引重建两次,但依然没有解决阻塞的发生
3.使用alter index rebuild语句重建索引
使用这个语句同样也重建索引,但是通过动态创建索引而不需要卸载并重建索引,是优于前两种方法的,但依旧会造成堵塞,可以通过online关键字减少锁,但会造成重建时间加长
4.使用alter index reorganize
这种方式不会重建索引,也不会生成新的页,仅仅是整理,当遇到加锁的页时跳过,所以不会造成阻塞。但同时,整理效果会差于前三种
5.使用填充因子
使用上面的方法的确可以解决碎片,但是麻烦比较多,尤其是在数据非常多的时候
填充因子的作用是设置一个页的使用程度,例如填充因子是0 (0-100是表示一个概念) 表示页的100%的空间都可以使用,所以会造成内部碎片时提到的情况,剩余空间不足,只能再开辟新页
那么如果我们把填充音质设置为80%,那么就会预留出20%的空间为插入数据或更新数据时使用,从而减少分页的次数
但是这样的话,原本一个页可以存储7条数据,现在却变成了6条,自然页的数量就会增加,要读取的页数变多,所以查询效率会降低,数据库文件占用的空间也会变大
所以使用填充因子时要根据读和写的情况
如果读的次数大幅度超过写的次数,那么就不要使用填充因子,直接让页100%用于储存
如果写大于读,那么填充因子可以设置50%-70%
如果读和写差不多,那么填充因子可以设置80%-90%
当然具体数值还是要根据实际情况判断
6.游标的作用
游标是一种能从包括多条数据的结果集 中 每次提取出一条数据的机制,游标充当指针的作用,尽管游标能遍历结果中的所有行,但是它一次只能指向一行。
游标就是一种临时的数据库对象,最常见的用途是保存查询数据,以便之后使用,如果在处理过程中需要多次使用结果集,创建一个游标重复使用,要比重复查询数据库要快的多
但游标就相当于把存在磁盘上的一部分数据拿到内存在存储,所以在数据量很大时不建议用游标
游标的声明 cursor c is select * from table
7.什么是大小端
内存是以字节为单位的,如果像char类型一样长度刚好1字节的话,并不会涉及到大小端模式,但是有很多类型是高于一字节的,例如short类型是2字节,int类型是4字节,这就存在着一个 数据的各个字节 的存放顺序问题,这个存放顺序就是大小端模式
大端和小端,也可以称为高尾端和低尾端
大端模式 : 指的是将数据从高到低的存储,即高字节的数据存放在低地址中,低字节的数据存放在高地址中
小端模式 : 指的是将数据从低到高的存储,即低字节的数据存放在低地址中,高字节的数据存放在高地址中
内存的高低地址
内存的地址对应十六进制的数值,值大的为高地址,值小的为低地址
为什么要分成大小端两种模式 ? 两者各自的优势
大端模式 : 因为高位存在前面,所以便于比较数值的大小和判断数值的正负 (比较大小从高位开始比)
小端模式 : 因为低位存在前面,所以便于数值的运算 (运算时从低位开始算)
数值的高低位
比如86这个数值,8是十位数,他就是高位,6是十位,则他是低位
整数类型是小端模式
inter处理器是小端模式
TCP/IP是大端模式
局部变量是先定义高地址,后定义低地址
类,结构,数组是先定义低地址,后定义高地址
8.AJAX的优缺点
Ajax的原理相当于在用户和服务器之间加了一个中间层,使用户的操作与服务器的响应异步化。并不是所有的请求都会提交给服务器,像一些数据验证或者数据处理等都会由Ajax引擎自己来做,只有需要从数据库读取数据时才会像服务器提交请求
优点
1.无刷新更新数据
2.异步的和服务器通信
3.前后端负载平衡,将一些服务器的工作移到了客户端处理,减轻了服务器的压力
4.可以被广泛支持
5.数据和页面分离,利于分工合作
6.减少服务器的负担,因为Ajax的根本理念是 "按需取数据" ,所以减少了很多冗余请求和对服务器的负担
缺点
1.不能使用浏览器的后退和历史记录功能
2.安全有一些问题
3.对搜索引擎支持比较弱
4.破坏了程序的异常处理机制 (不会报错)
5.不能很好的支持移动设备,手机的浏览器不支持ajax
6.增加了客户端的代码,造成客户端过肥
9.=、==、===之间的区别
= 赋值运算符 赋值时使用
== 关系运算符 判断两个值是否相同,但是这个运算符不考虑类型,只判断值是否相同
=== 关系运算符 判断两个值是否完全相同,这个运算符会考虑类型,使其为绝对相同
10.写出一条SQL语句,取出表A中31到40的记录(注意ID可能是不连续的)
select top 10 * from a where id not in (select top 30 id from a order by id) order by id
筛掉前三十条数据,然后取之后的十条,即31到40
11.项目分为几个阶段
需求分析 - 概要设计 - 详细设计 - 编码 - 测试 - 软件交付 - 验收 - 维护
12.冒泡排序
for (int i = 0; i < arr.Length - 1; i++) { judge = true; for (int j = 0; j < arr.Length - 1 - i; j++) { if (arr[j] > arr[j + 1]) { judge = false; arr[j] = arr[j] + arr[j + 1]; arr[j + 1] = arr[j] - arr[j + 1]; arr[j] = arr[j] - arr[j + 1]; } } if (judge) break; }
13.C#和.net的区别
.net是微软为了开发应用程序而创建的一个框架,其本身包括着一个庞大的类库(.net framework),可以使用一些语言(如C#)通过面向对象(OOP)的编程思想调用其中的代码
而C#是为了调用.net类库创建的一个语言,除了C#以外,还有其他的语言可以调用.net类库,如VB,J#等
14.public等四个访问修饰符的作用
private 私有 被此修饰的成员只能在本类中被访问,类中的成员,默认为private
protected 保护 被此修饰的成员只能在本类和子类中被访问
internal 内部 被此修饰的成员只能在本程序集中被访问
public 公开 被此修饰的成员没有限制,任何地方都可以访问
15.String和StringBuild的区别
String对象是不可改变的,每次调用string的方法改变对象都会在内存中重新开辟一个空间
StringBulid对象是动态对象,允许扩充他存储的字符数量,当修改StringBuild时,他不会重新分配空间,而是把空间翻倍
StringBuild比String浪费性能,所以只有在大量字符串拼接操作是才推荐使用
16.项目的优化方式
1.使用redis,Memcached等分布式缓存技术
2.使用页面静态化优化
3.使用nginx服务器进行负载均衡
17.用户角色功能如何去重
系统有多个用户,用户可以拥有不止一个角色(又称身份、职业、类型等),每一个角色可以有很多种权限,不同角色的权限允许重复。
18.MVC与WEBFORM区别
webform把用户的请求和响应都封装成了控件,大大提升了开发效率,但是也有明显的缺点,封装的东西太多,让开发者无法知道背后html实际是怎么样运行的,而且页面体积比实际需求的内容要大,运行较慢
mvc是一种项目的架构模式,他把项目分为model(模型),view(视图),controller(控制器),Asp.Net是微软基于mvc的模式开发的一个架构,比webform要灵活一些
19.ADO.NET与NET有什么区别和联系
ADO.NET是.NET框架中用来访问数据的组件库
20.jquery有哪几种查找方式
1.基本选择器
2.层次选择器
3.过滤选择器
基本过滤选择器
内容过滤选择器
可见性过滤选择器
属性过滤选择器
子元素过滤选择器
表单对象属性过滤选择器
4.表单选择器
21.SQL语句里,怎么把一列的值排成一行
pivot可以行转列,unpivot可以列转行
22.Jquery和JS的取值和赋值
$("input").val();
$("input").val("123");
document.getElementById("id").value
23.bootstrap是哪个公司开发的,为什么用它
bootstrap是twitter公司开发的,它是一个前端开发的工具包,
24.数据库中0是男,1是女,但是查询结果不显示0,1直接显示男女
select case sex when 0 then '男' when 1 then '女' end from table
25.MVC和三层的区别
三层是以整个项目架构的视角把它分成三层
mvc只是以项目的视图层的视角把它们分为不同功能的模块
它们的作用范围不同,两者之间没有任何关系,也不冲突可以同时使用
26.分别求出0到100的奇数偶数之和
int evenSum = 0, oddSum =0; for (int i = 0; i <=100; i++) { if (i % 2 == 0) evenSum += i; else oddSum += i; }
27.三元运算符
1>2?true:false
28.委托怎么拼
delegate
29.用oracle数据库连表查询 模糊查询
连表 select * from a join b on(a.id=b.id);
模糊查询 select * from a where name like '%王%'
30.在C#中判断字符串相同有哪些方法,哪种最优?
- Str1 ==str2
- Str1.Equals(str2)
- String.Equals(str1,str2)
- String.Compare(str1,str2)
- Str1.CompareTo(str2);
第一种最优
31.向服务器发送请求有几种方式
- get 请求服务器某个资源
- post 像服务器提交数据
- put 和post类似,但是put指定了资源的位置,post的数据存放位置由服务器自己分配,然后反馈给客户端,put是客户自己指定资源位置
- options 获取当前url所有支持的请求方式
- delete 删除资源
- connect HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
- head 与get相似,但是head不包括相应体,这只有请求头,一般用于确认某资源是否存在
- trace 返回显服务器收到的请求,主要用于测试或诊断
32.进程和线程的区别
一个程序至少有一个进程,一个进程至少包含一个线程(主线程)
进程之间相互独立,一个进程出问题不影响其他进程,但线程一个出问题就会导致进程的瘫痪
线程的开销小,但是不利于管理和保护
33.a=10,b=15,再不用第三方变量的前提下,把a,b,的值互换
int a = 1,b=2 a=a+b-(b=a);
int a = 1,b=2 a=a+b; b = a-b; a=a-b;
34.ref和out的相同与不同
相同 : ref和out都是引用传递,会改变原有的值
不同 :
ref指定的参数在函数调用时必须初始化,不能为空的引用,而out指定的函数调用时可以不初始化,
out指定的参数在进入函数时会清空自己,必须在函数内部赋初值,而ref指定参数不需要。
35. <%#%><%%>的区别
<%%> 用来写服务端代码 例如 <%Response.Write(""); %>
<%#%> 是用来绑定数据的
36.一列数的规则如下:1、1、2、3、5、8、13、21、34.....求第30位数是多少,用递归算法实现
public class MainClass { public static void Main() { Console.WriteLine(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); } }
37.C#中委托是什么?事件是不是委托?
委托可以把一个方法作为参数传入另一个方法。
委托可以理解为指向一个函数的引用
事件是委托,是一种特殊的委托。
38.override与重载的区别
override是子类覆盖父类原本的方法,而重载是本类中出现多个姓名相同的方法,但参数不同时,根据给的参数调用相对应的方法
39.如果在一个B/S结构的系统里需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方式进行处理?
QueryString 通过地址传值 例如 default.aspx?id=1
Server.Transfer 服务器重定向
40.请编程 遍历页面所有TextBox控件并给它赋值为string.Empty
foreach(System.Windows.Forms.Control crl in this.Controls) { if(crl is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)crl; tb.Text = String.Empty; } }
41.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
实现过程?不知道
不是只能数字,可以用任意类型
42.求以下表达式的值,写出您想到的一种或多种实现方法
1-2+3-4+......+m
int Num = this.TextBox1.Text.ToString(); int Sum = 0; for(int i =0;i<Num+1;i++) { if(i%2==1) { Sum+=i; }else { Sum = Sum-i; } } System.Console.WriteLine(Sum.ToString());
43.在下面的例子里
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
当使用new B()创建B的实例时,产生什么输出
答:X=1,Y=0;X=1,Y=-1
44.CTS、CLS、CLR分别作何解释
CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库
45.什么是装箱和拆箱
值类型转换到引用类型是装箱。引用类型转换到值类型是拆箱
46.什么是受管制的代码
在.net环境运行的代码都是受管制代码(经过CLR)
在.net环境以外,windows上运行的代码都是非受管制代码(不经过CLR)
47.什么是强类型系统
RTTI (Runtime Type Identification) 类型识别系统
48..Net中读写数据库需要用到哪些类?他们的作用?
SqlConnection 创建数据库连接
SqlCommand 执行SQL语句
SqlDataReader 顺序的读取数据
DataTable 保存一个表的数据
DataSet 无连接的保存多个表数据,并包括他们之间的关系
DataAdapter 把数据填充到DataTable,DataSet中
49.什么是Code-Behind技术?
代码后置。
50.在.net中,配件的意思是什么
程序集
51.常用的调用WebService的方法有哪些
1.使用WSDL.exe命令行工具
2.项目引用 (Add Web Reference)
52..netRemoting 的工作原理是什么
remoting可以让.net平台的两个应用程序互相知晓对方,并进行交流与webservice比较像,但是remoting多用于局域网
原理为:服务端向客户端发送一个进程编号,一个程序域编号,确定对象的位置
53.在C#中,string str = null 与 string str = “” 有什么区别
string str = null 是不给他分配内存空间的,而string str = “” 会给他分配空字符串的内存长度
54.类和结构的区别和相同
类可以被实例化,属于引用类型,是分配在内存的堆上
结构是值类型,是分配到内存的栈上的
55.Web API的安全性怎么解决
设置Token,提供一个认证API,用户要先访问它获取Token值,然后每次请求对比Token,来验证调用者的身份,例如(JWT)
56.数据库的临时表是什么
临时表和永久表相似,但只是临时存储,不用的时候就会删掉
临时表分为全局临时表和普通临时表
语法:
普通临时表
CREATE TABLE #Temp ( id int, customer_name nvarchar(50), age int )
全局临时表
CREATE TABLE ##Temp ( id int, customer_name nvarchar(50), age int )
57.全局临时表和普通临时表有什么区别
普通临时表只能在当前连接访问到,当前连接不使用时就会自动删除
全局临时表所有的连接都可以访问到,当所有连接都不使用时才会删掉
58.除了web api以外还有什么开发api的技术
web service、WCF
59.. Net中可序列化的类都被标记什么
[serializable]