zoukankan      html  css  js  c++  java
  • .net面试题目问答题1

    [.NET(C#)]
    把attribute翻译成特性,用来标识类,方法
    把property翻译为属性,性质,用于存取类的字段
    把markup翻译成标记,tag还是翻译成标签比较好

    [.NET(C#)]
    .NET Framework的核心是其运行库的执行环境。
    称为公共语言运行库(CLR)或.NET运行库.
    通常将在CLR的控制下运行的代码称为托管代码(managed code).
    在CLR执行开发的源代码之前,需要编译它们为中间语言(IL),CLR再把IL编译为平台专用的代码。

    程序集(assembly)是包含编译好的,面向.NET Framework的代码的逻辑单元.
    可执行代码和库代码使用相同的程序集结构.
    程序集的一个重要特性是它们包含的元数据描述了对应代码中定义的类型和方法.

    [.NET(C#)]
    ASP页面有时显示比较慢,因为服务器端代码是解释性的不是编译的.
    由于ASP代码不是结构化的所以难于维护,加上ASP不支持错误处理和语法检查。
    而ASP.NET页面是结构化的。每个页面都是一个继承了.NET类System.Web.UI.Page的类。
    另外ASP.NET的后台编码功能允许进一步采用结构化的方式.
    页面请求是和WEB服务器在编译后高速缓存ASP.NET页面。

    [.NET(C#)]
    覆盖(override)和重载(overload):
    覆盖是指子类重新定义父类的虚函数的做法。
    重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不

    同)。
    其实,重载的概念并不属于“面向对象编程”,
    重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰
    然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。
    如,有两个同名函数:function    func(p:integer):integer;    和function func(p:string):integer;。
    那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。
    对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。
    也就是说,它们的地址在编译期就绑定了(早绑定),
    因此,重载和多态无关!真正和多态相关的是“覆盖”。
    当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类

    的该函数,
    这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。
    因此,这样的函数地址是在运行期绑定的(晚邦定)。
    结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!

    [.NET(C#)]
    C#中ref和out的区别:
    方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。
    当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
    当希望方法返回多个值时,声明 out 方法非常有用。
    使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。
    若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。
    不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。
    属性不是变量,不能作为 out 参数传递。

    方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。
    当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。
    若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。
    ref 参数的值被传递到 ref 参数。 传递到 ref 参数的参数必须最先初始化。
    将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。
    属性不是变量,不能作为 ref 参数传递。

    两者都是按地址传递的,使用后都将改变原来的数值。
    ref可以把参数的数值传递进函数,但是out是要把参数清空
    就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。
    两个的区别:ref是有进有出,out是只出不进。

    [.NET(C#)]
    ADO和ADO.NET的区别:
    ADO使用OLE DB接口并基于微软的COM技术
    而ADO.NET拥有自己的ADO.NET接口并且基于微软的.NET体系架构。
    ADO以Recordset存储,而ADO.NET则以DataSet表示。
    Recordset看起来更像单表,如果让Recordset以多表的方式表示就必须在SQL中进行多表连接。
    反之,DataSet可以是多个表的集合。ADO 的运作是一种在线方式,这意味着不论是浏览或更新数据都必须是实时的。
    ADO.NET则使用离线方式,在访问数据的时候ADO.NET会利用XML制作数据的一份幅本
    ADO.NET的数据库连接也只有在这段时间需要在线。
      
    由于ADO使用COM技术,这就要求所使用的数据类型必须符合COM规范
    而ADO.NET基于XML格式,数据类型更为丰富并且不需要再做COM编排导致的数据类型转换,从而提高了整体性能。
    ADO.NET为.NET构架提供了优化的数据访问模型,和基于COM的ADO是完全两样的数据访问方式。

    ado.net与ado存在着比较大的差异:
    1.ado.net遵循更通用的原则,不那么专门面向数据库。
    ado.net集合了所有允许数据处理的类。这些类表示具有典型数据库功能(如索引,排序和视图)的数据容器对象。
    尽管ado.net是.net数据库应用程序的权威解决方案
    但从总体设计上看,它不像ado数据模型那样以数据库为中心,这是ado.net的一大特点。
    2.目前,ado.net提供了两种数据库访问类库:一种用于sql server 7.0 或更高版本
    另一种用于其他所有您可能已经安装的ole db提供程序。
    在这两种情况下,您分别使用不同的类,但遵循相似的命名规则。
    除前缀,名称都是相同的。前一种情况前缀为sql,后一种情况则是oledb。
    同时,.net框架还提供了odbc .net的数据访问模式。
    odbc .net data provider是 .net 框架的增强组件,它可以访问原始的 odbc 驱动程序
    就像 ole db .net data provider 可以访问原始的 ole db providers 一样。
    目前它仅在下列驱动程序中测试过:
    microsoft sql odbc driver,microsoft odbc driver for oracle,microsoft jet odbc driver。
    3.ado.net提供了两个队形来处理从数据源中抽取数据,它们是dataset和datareader对象。
    前者是记录在内存中的缓存,您可以从任何方向随意访问和修改。
    后者是高度优化的对象,专为以仅向前方式滚动只读记录而设计。
    4.ado.net统一了数据容器类编程接口,无论您打算编写何种应用程序,windows窗体,web窗体还是web服务
    都可以通过同一组类来处理数据。
    不管在后端的数据源数sql server数据库,ole db,xml文件还是一个数组
    您都可以通过相同的方法和属性来滚动和处理它们的内容。
    5.在ado中,xml只不过是输入和输出格式。
    然而在ado.net中,xml是一种数据格式,提供了操作,组织,共享和传递数据的手段。

    ADO。NET相对于ADO等主要有什么改进?
    1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,
    2:不使用com
    3:不在支持动态游标和服务器端游
    4:,可以断开connection而保留当前数据集可用
    5:强类型转换
    6:xml支持

    [.NET(C#)]
    new 关键字用法
    (1)new 运算符 用于创建对象和调用构造函数。
    (2)new 修饰符 用于向基类成员隐藏继承成员。
    (3)new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。
    指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。

    [.NET(C#)]
    C#中,string str = null 与 string str ="",说明区别。
    string str =""初始化对象分配空间
    而string str=null初始化对象

    [.NET(C#)]
    DataGrid的Datasouse可以连接什么数据源
    DataTable DataView DataSet DataViewManager 任何实现IListSource接口的组件 任何实现IList接口的组件

    [.NET(C#)]
    概述反射和序列化
    反射:公共语言运行库加载器管理应用程序域。
    这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
    程序集包含模块,而模块包含类型,类型又包含成员。
    反射则提供了封装程序集、模块和类型的对象。
    您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。
    然后,可以调用类型的方法或访问其字段和属性。

    序列化:序列化是将对象状态转换为可保持或传输的格式的过程。
    与序列化相对的是反序列化,它将流转换为对象。
    这两个过程结合起来,可以轻松地存储和传输数据。

    [.NET(C#)]
    可访问性级别有哪几种
    public 访问不受限制。
    protected 访问仅限于包含类或从包含类派生的类型。
    internal 访问仅限于当前程序集。
    protected internal 访问仅限于从包含类派生的当前程序集或类型。
    private 访问仅限于包含类型。

    [.NET(C#)]
    O/R Mapping 的原理:利用反射,配置将对象和数据库表映射。

    [.NET(C#)]
    sealed 修饰符有什么特点?
    sealed 修饰符表示密封,用于类时,表示该类不能再被继承
    不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥
    用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用
    因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员
    通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱
    恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员

    [.NET(C#)]
    详述.NET里class和struct的异同
    结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:
    尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。
    结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
    结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。
    实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。
    结构不能从类或其他结构继承。
    结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。
    复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。
    由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。
    C# 中的所有值类型本质上都继承自 ValueType,后者继承自 Object。
    编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

    结构具有以下特点:
    结构是值类型,而类是引用类型。
    向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
    与类不同,结构的实例化可以不使用 new 运算符。
    结构可以声明构造函数,但它们必须带参数。
    一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
    所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
    结构可以实现接口。
    在结构中初始化实例字段是错误的。

    类与结构的差别
    1. 值类型与引用类型
    结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型
    例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型
    类是引用类型:引用类型在堆上分配地址 堆栈的执行效率要比堆的执行效率高
    可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。
    所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
    因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 注:
    1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
    2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上
    如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
    2.继承性
    结构:不能从另外一个结构或者类继承,本身也不能被继承
    虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
    类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
    注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
    例如:结构实现接口
    interface IImage
    {
    void Paint();
    }
    struct Picture : IImage
    {
    public void Paint()
    {
    // painting code goes here
    }
    private int x, y, z; // other struct members
    }

    3.内部结构:
    结构:
    没有默认的构造函数,但是可以添加构造函数
    没有析构函数
    没有 abstract 和 sealed(因为不能继承)
    不能有protected 修饰符
    可以不使用new 初始化
    在结构中初始化实例字段是错误的
    类:
    有默认的构造函数
    有析构函数
    可以使用 abstract 和 sealed
    有protected 修饰符
    必须使用new 初始化

    [.NET(C#)]
    如何选择结构还是类
    1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
    2. 结构表示如点、矩形和颜色这样的轻量对象
    例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。
    在此情况下,结构的成本较低。
    3. 在表现抽象和多级别的对象层次时,类是最好的选择
    4. 大多数情况下该类型只是一些数据时,结构时最佳的选择


  • 相关阅读:
    爬虫之移动端数据爬取
    Python网络爬虫之图片懒加载技术、selenium和PhantomJS
    iOS-类方法
    iOS-二进制,十进制,十六进制的相互转换
    iOS-category
    iOS-.h和.m文件
    iOS-关于@property和@synthesize
    自定义控件-使用frame和代码的自定义UI控件
    跨平台开发
    GitHub探索
  • 原文地址:https://www.cnblogs.com/lijun-xiao/p/3225708.html
Copyright © 2011-2022 走看看