.NET面试题-自用款

  1. 垃圾回收机制
    在C#中有GC垃圾回收器,一般来说系统会自动检测不再使用的对象或者变量,对其进行内存释放,不需要进行手动调用,Collector就是强制进行垃圾回收使得内存及时得到释放提高效率。
    作用:1)大大减少了内存认为管理不当所带来的bug
    2)使内存管理更加高效

  2. 什么是面向对象
    1)封装:把客观的事务封装成抽象的类,并且类可以把自己的数据和方法只让信任的类或者对象操作,对不可信的进行信息隐藏
    2)继承:子类继承父类的的所有数据和操作。
    分为两类:实现继承和接口继承
    2.1)实现继承:直接使用基类的属性和方法,而无需额外的编码的能力
    2.2)接口继承:仅使用属性和方法的名称,但是子类必须提供实现的能力
    3)多态:一个程序中同名的不同方法

  3. 拆箱和装箱
    拆箱:值类型转换为引用类型
    装箱:引用类型转换为值类型

  4. 简述private、protected、internal、public、sealed修饰符的访问权限
    private:私有成员,只能在类的内部访问
    protected:受保护的成员,可以在类的内部和继承类中访问
    internal:同一命名空间下可访问
    public:公共成员,没有访问限制,所有都可以访问、
    sealed:密封类,不被任何类继承

  5. 委托是什么?事件是不是一种委托?
    委托是引用类型的变量,可以引用一个或多个方法。
    当程序必须通过调用一个方法来执行某个操作,但是编译时不知道该方法是什么时,就可以用委托。
    委托类似于C++中的函数指针,它能够引用函数,但在C#中委托是一个对象,且是安全的。
    委托可以把一个方法作为参数传入另一个方法。可以理解为指向一个函数的引用。
    事件是一种特殊的委托。

  6. 重载和重写的区别:
    重载:在同一个类中,方法名相同,参数列表不同
    重写:当子类继承父类的时候,子类重写父类的方法(方法名、参数个数、类型完全一致),在调用的时候,子类的方法会覆盖父类的方法,也就是会调用子类的方法。
    抽象方法必须重写,虚方法可重写可不重写。

  7. abstract、virtual、interface
    abstract:用来声明抽象方法、抽象类
    抽象类的目的是提供一个合适的基类,以派生其他的类。抽象类不能实例化,必须在继承中实现。
    抽象方法不包含方法主体,必须由派生类以override方式实现此方法,这点跟interface中的方法类似

    virtual:子类在重写父类的某个方法时,必须把父类的方法定义为virtual

    interface:一个类继承接口,那必须实现这个接口,一个类可以直接继承多个接口
    接口只提供一些方法规约,不提供方法主体。方法不能用public abstract等修饰, 无字段变量,无构造函数。

  8. 错误处理机制
    结构:try > catch > finally
    处理顺序:try里面发现错误会被catch捕获,finally不管有没有错误都会执行

  9. 线程和进程
    进程是资源分配和调度的最小单位,线程是程序执行的最小单位。
    一个进程包含多个线程。
    进程有自己的独立地址空间,没启动一个进程,系统会为它分配地址空间。

  10. WCF 和 Web Service
    Web Service:。。。
    WCF:。。。

  11. const 和 static 不能同时存在,因为定义常量(const)后就是静态的(static)

  12. 序列化一个类,用哪个单词标记
    在类定义前面加上 [Serializable()]
    如:[Serializable()]public class User{…}

  13. 类与接口的区别
    接口是功能的定义,类是功能的具体实现
    接口的方法只能声明不能定义,类可以
    接口的方法不能为abstract 或 virtual,类可以
    一个类可以实现多个接口,一个类只能继承一个类
    用法:类 : 类 --》 继承类
    类 : 接口 --》 实现接口
    接口 : 接口 --》 继承接口

  14. ref 和 out
    ref传递变量前,变量必须初始化,否则会报错;out不需要初始化,退出函数时,out参数要赋值
    ref将变量传递进方法修改后值可以继续传出来;out不行,仅用于传回结果

  15. 有几种循环,分别用在什么场合
    do while:不管是否符合条件都会运行一次do里面的内容,在运行一次之后再进行判断是否符合条件
    while:首先判断是否符合条件再运行
    for:和while类似,形式不同,一般需要定义局部控制循环的变量
    foreach:只能读;且遍历顺序只能是递增(默认++)

  16. json格式串
    [{“name”: “lala”, “age”: “18”}]

  17. 编程题:定义一个int数组,长度为100,并向其中随机插入1-100的数字,保证不重复

public int[] getArr()
{
    int[] arr = new int[100];
    List<int> list = new List<int>();
    for (var i = 0; i < arr.Length; i++)
    {
        list.Add(i + 1);
    }
    Random rd = new Random();
    int j = 0;
    while (list.Count > 0)
    {
        int num = rd.Next(0, list.Count);
        int tmp = list[num];
        arr[j] = tmp;
        list.Remove(tmp);
        j++;
    }
    return arr;
}
  1. 编程题:编写一个冒泡排序的方法,参数传入一个int数组
int[] arr = bubbleSort(new int[] { 3, 6, 1, 7, 2, 9, 0 }); //调用

public int[] bubbleSort(int[] arr)
{
    for (var i = 0; i < arr.Length; i++)
    {
        for (var j = i + 1; j < arr.Length; j++)
        {
            if(arr[j] < arr[i])
            {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
    return arr;
}
  1. 编程题:1 1 2 3 5 8 13 21 34 55 用递归算法编写一个方法,计算第n位上的数值(n>0)
public int getNum(int n)
{
    if (n <= 2)
    {
        return 1;
    }
    return getNum(n - 1) + getNum(n - 2);
}
  1. 编程题:1-2+3-4+……+m 输出结果
public int getRes(int m)
{
    int sum = 0;
    for(var i=1;i<= m; i++)
    {
        if (i % 2 == 0)
        {
            sum -= i;
        }
        else
        {
            sum += i;
        }
    }
    return sum;
}
  1. 简述:string str = null、string str = “”、string str = string.empty
    string str = null:字符串内容为空值,没有为str分配空间,不占内存
    string str = “”:是一个空字符串,为str分配了空间,占内存
    string str = string.empty:是一个空字符串,没有为str分配空间

  2. 三层架构和MVC
    三层架构:分为表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
    表现层:就是给用户展示的页面
    业务逻辑层:针对具体的操作,进行数据业务逻辑处理
    数据访问层:直接操作数据库,对数据进行增删改查
    目的是高内聚,低耦合,即“解耦”
    MVC:分为模型(Model)、视图(View)、控制器(Controller)
    就是一种设计模式
    Model:封装的是数据源和基于这些数据的操作的组件
    View:封装的是对Model数据的进行内容展示的组件,一个模型可以有多个视图,一个视图也可以与多个模型关联
    Controller:接受并处理用户指令,选择一个View输出,封装的是外界作用于模型的操作,这些操作会转发到模型上,并调用模型中相应的方法。
    一般Controller在model和view之间起到了沟通作用:处理用户在view上的输入,并转发给model
    目的是实现web系统的职能分工,可以看作三层架构中表现层的一种细分 .NET面试题-自用款_第1张图片
    两者之间的关系:.NET面试题-自用款_第2张图片
    MVC经常是和三层架构一起出现的
    内聚性:块内联系,即模块内部功能间的紧密程度,联系越紧密,内聚性越高
    耦合性:块间联系,即系统各个模块之间的连接紧密程度,紧密度越高,耦合性越强,模块独立性就越差

  3. 多线程编程中,sleep() 和 wait()有什么区别?
    wait()和sleep()都可以通过interrupt()方法来打断线程的暂停状态 ,一旦该线程进入到 wait()/sleep()/join()后,就会抛出InterruptedException;如果线程在正常运行中,则不会抛出这个异常,在实际编码中,可以使用try…catch来安全结束线程。
    区别:
    1)wait()是Object类的方法,sleep()是Thread类的方法
    2)wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
    3)sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
    Datetime是struct,值类型,值类型是不能为null的.只有Datetime的泛型表达DateTime?类型可以赋值为null,但这只是一种简写,DateTime?的实际类型为Nullable.所有值类型都可以转换为这种形式来赋值为null

  4. 简述List和Dictionary的区别和优势
    List:集合,用来存储某种类型的列表
    Dictionary:字典,根据key找value
    List效率比Dictionary快,因为在Dictionary中,除了要存储实际要的value外,还要存一个辅助变量key,造成内存空间的双重浪费

  5. 简述MVC设计模式及其工作原理
    MVC是一种软件开发架构,它包含了很多的设计模式,最为密切是以下三种:观察者模式,组合模式和策略模式  
    MVC架构把数据处理,程序输入输出控制及数据显示分离开来,并且描述了不同部件的对象间的通信方式,使得软件可维护性,可扩展性,灵活性以及封装性大大提高。
    MVC(Model-View-Controller)把系统的组成分解为M(模型)、V(视图)、C(控制器)三种部件。V(视图)表示数据在屏幕上的显示;C(控制器)提供处理过程控制,它在模型和视图之间起连接作用。控制器本身不输出任何信息和做任何处理,它只负责把用户的请求转成针对Model的操作,和调用相应的视图来显示Model处理后的数据。

  6. 简述asp.net六大内置对象及用法
    1)Response对象:是HttpResponse类的一个对象,与一个HTTP响应相对应,通过该对象的属性和方法可以控制如何将服务端的数据发送到客户端浏览器
    2)Request对象:是HttpRequest类的对象,当用户发出请求,客户端的请求会包装在Request对象中,请求信息包括:请求头、请求方法(post、get)、提交的信息等
    3)Server对象:反应了Web服务器的各种信息,提供了服务器可以提供的各种服务
    4)Application对象:在实际网络开发中就是记录整个网络的信息,如上线人数等。在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据
    5)Session对象:负责存储、读取和改变一个特定用户的会话信息,对于每个对象的每次访问,session对象都是唯一的
    6)Cookie对象:在web程序设计中,它表示一个长度不超过4K的文本文件,这个文件在用户的硬盘上,可以由web浏览器进行访问

  7. Asp.net 页面传值的方式
    1)Request.QueryString:获取http查询字符串变量集合,Request.QueryString[string name]
    2)Request.Form:获取窗体变量集合,Request.Form[string name]
    3)Session:Session[“string”] = string

  8. Session,ViewState,Application,cookie的区别
    Session:负责存储、读取和改变一个特定用户的会话信息,保存在服务器上,对于每个对象的每次访问,session对象都是唯一的
    ViewState:主要用于保持 Web 页上控件的状态。
    Application:在实际网络开发中就是记录整个网络的信息,如上线人数等。在给定的应用程序的多有用户之间共享信息,并在服务器运行期间持久的保存数据
    cookie:主要用它存储用户的个性设制和登录信息。在web程序设计中,它表示一个长度不超过4K的文本文件,这个文件在用户的硬盘上,可以由web浏览器进行访问【保存在客户端浏览器上】

  9. 在MVC中如何保持Sessions
    可使用tempdata、viewdata、viewbag三种方式。其中,
    tempdata:在不同的控制器或动作间转换时保持数据。另外,进行页面转向时,tempdata可以保持数据,它是一个内部的Session变量。
    Viewdata:可以在控制器和视图间保持数据。
    Viewbag:它是视图数据的动态包装,使用viewbag不需要类型转换,它使用的是内部动态关键词。

  10. Session有什么重大BUG,微软提出了什么方法加以解决?
    IIS中由于有进程回收机制,系统繁忙的话Session会丢失,IIS重启也会造成Session失。这样用户就要重新登录或者重新添加购物车、验证码等放到Session中的信息。
    可以用State Server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。但是这不是Bug,只能说是In-Proc方式存储Session的缺陷,缺陷是和Bug不一样的,In-Proc方式存储Session会由服务器来决定什么时候释Session,In-Proc方式不满足要求的话完全可以用StateServer和数据库的方式。

  11. get和post的区别
    get:会暴露用户请求的数据在url地址中,并且数据有大小限制,但是处理速度快
    post:不会暴露用户的请求参数,对数据大小没有限制,单数处理速度相对get请求较慢

  12. 简述WebService技术及在开发过程中的使用
    webservice采用HTTP协议传输数据,数据格式为XML。
    在开发工程中webservice向外界暴露一个能通过web进行调用的api,客户端可以通过请求这个接口来获取数据

  13. 什么是SOAP协议
    访问网络服务的协议,基于XML的简易协议,可使应用程序在HTTP上进行信息交换

  14. 什么是SQL注入攻击,如何防范
    SQL注入攻击:攻击者将SQL命令插入到web表单的输入区域或者页面请求的查询字符串里,欺骗服务器执行恶意的SQL命令,从而对数据库的数据进行操作的一种手段
    防范:
    1)进行字符串替换,替换掉一些敏感字符
    2)使用存储过程完成数据的查询
    3)限制表单输入的字符长度
    4)在后端对用户输入的信息校验合法性
    5)检查提取数据的查询所返回的记录数量
    6)将用户名、密码等数据加密保存
    避免:
    使用参数化的SQL

  15. 简述ADO.NET五大对像
    1)Connection:连接数据库
    2)Command:执行T-SQL语句
    3)DataAdapter:用户填充DataSet,断开模式
    4)DataReader:读取数据库,只读模式
    5)DataSet:数据集,好比电脑的内存

  16. MVC有多少种不同类型的结果类型,请详细描述
    有12种,最主要的是ActionResult类,它是一个基础类,它有11个子类型。
    ViewResult - 给响应流渲染指定的视图
    PartialViewResult - 给响应流渲染指定的局部视图
    EmptyResult - 返回空的响应结果。
    RedirectResult - 执行一个HTTP转向到指定的URL。
    RedirectToRouteResult -执行一个HTTP转向到一个URL,这个URL由基于路由数据的路由引擎来决定
    JsonResult - 序列化一个ViewData对像到JSON格式。
    JavaScriptResult - 返回一段javascript代码,它可以在客户端执行。
    ContentResult - 写内容到响应流,不需要视图支持。
    FileContentResult - 返回一个文件到客户端。
    FileStreamResult - 返回一个文件到客户端,它提供的是流。
    FilePathResult - 返回一个文件到客户端。

  17. string 和 StringBuilder
    string:属于引用类型,存储在堆上,传递的是地址
    例如:string s = “1234”;是创建了一个String对象它的值是”1234”,s指向了它在内存中的地址,s += “5678”;是创建了一个新的String对象它的值是”12345678”,s指向了新的内存地址。这时在堆中其实存在着两个字符串对象,尽管我们只引用了他们中的一个,但字符串”1234”仍然在内存中驻留。
    如果我们创建很多个相同值的字符串对象,它在内存中的指向地址应该是一样的,不会再去分配内存。
    所以,String类型在做字符串的连接操作时,效率是相当低的,并且由于每做一个连接操作,都会在内存中创建一个新的对象,占用了大量的内存空间

    StringBuilder:在做字符串连接操作时是在原来的字符串上进行修改

    可以看出用String来做字符串的连接时效率非常低,但并不是所任何情况下都要用StringBuilder,当我们连接很少的字符串时可以用String,但当做大量的或频繁的字符串连接操作时,就一定要用StringBuilder。

  18. 数据库三大范式
    第一范式:每一列都是不可分割的基础数据项
    第二范式:在第一范式的基础上,每一行都有唯一标识存在,比如主键
    第三范式:在第二范式的基础上,属性不依赖于其他非主属性(即表引用其他的表必须通过主键引用)

  19. 如何提高页面的显示速度?假如一个页面的加载时间是10.89s,你会用什么样的方式进行优化
    首先要找出问题所在,是服务器端运行的速度慢 还是 服务器端到客户端的下载慢 还是 页面在浏览器的加载速度慢。

    如果是服务器端运行速度慢,则找是数据库的原因还是算法的问题,如果是数据库的问题则尝试添加索引、优化SQL语句,如果是算法的问题,则优化算法。如果对于一些不经常改动的页面可以使用静态页技术!对于一些数据不需要及时更新的而且取数据的过程非常耗时可以使用缓存。页面中的内容可以按需加载(比如说可以像网站的评论那样当用户需要看的时候再加载其内容),可以在图片需要显示的时候再进行加载。

    如果是服务器端到客户端的下载慢则看是页面体积过于臃肿还是网络问题,如果是页面体积过于臃肿,则优化HTML代码,去掉无用的标签,压缩JS、CSS,可以用CSS Spirit技术将多个图片放到一个图片中,减少向服务器的请求。如果是网络问题,则尝试在不同的网络、地区部署服务器,然后使用CDN技术加速访问。

    如果是页面中的JavaScript运行复杂导致运行速度慢,则优化JavaScript。

你可能感兴趣的:(c#,asp.net,面试)