zoukankan      html  css  js  c++  java
  • 关于.net 面试题整理

    .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]

  • 相关阅读:
    【t090】吉祥数
    【u221】分数
    【u212】&&【t036】最大和
    【u125】最大子树和
    【u124】环状最大两段子段和
    【u123】最大子段和
    【u122】迎接仪式
    【u121】教主的花园
    【u118】日志分析
    【u117】队列安排
  • 原文地址:https://www.cnblogs.com/cfss/p/9199761.html
Copyright © 2011-2022 走看看