.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#中判断字符串相同有哪些方法,哪种最优?

 

  1. Str1 ==str2
  2. Str1.Equals(str2)
  3. String.Equals(str1,str2)
  4. String.Compare(str1,str2)
  5. Str1.CompareTo(str2);

 

 第一种最优

31.向服务器发送请求有几种方式

  1. get 请求服务器某个资源
  2. post 像服务器提交数据
  3. put 和post类似,但是put指定了资源的位置,post的数据存放位置由服务器自己分配,然后反馈给客户端,put是客户自己指定资源位置
  4. options 获取当前url所有支持的请求方式
  5. delete 删除资源
  6. connect HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
  7. head 与get相似,但是head不包括相应体,这只有请求头,一般用于确认某资源是否存在
  8. 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]

posted @ 2018-01-06 01:21  生命不息bug不止  阅读(533)  评论(0编辑  收藏  举报