2011年.NET面试题总结---献给即将找工作的同行们<二>

C#中的委托是什么?如何理解委托?

简单的说:委托是一种方法容器,里面可以装载若干个具有相同签名的方法引用地址,那么调用委托,就相当于同时调用了该容器内的所有方法。

委托可以看做一种新的对象类型,具有面向对象的特点,定义时可签名接收参数,委托实例化时,可以把方法名作为一个参数传递给委托对象,委托可以理解为指向函数的引用。生成的委托对象可以代理所传递的方法,可以接收方法的参数。也就是定义了委托,可以在不用调用原方法的情况下,调用那个方法

 

例:

例:

    public delegate string MyDel(string nm,string pwd); //定义委托签名接收两个参数

    static void Main(string[] args)

    {

      MyDel md=new MyDel(方法名)        //定义委托对象,其引用变量指向参数中的方法

      string result=md("张三","1234"); //调用委托对象,传递所指方法的参数

    }

委托类似于 C C++中的函数指针。但不同的是委托是面向对象、类型安全的。

委托允许将方法作为参数进行传递。

委托可用于定义回调方法。

委托可以链接在一起;创建多个对象,使用“+=”累加到同一个委托对象上的引用上,例如,可以对一个事件调用多个方法。

public delegate string MyDel(string nm,string pwd); //定义委托签名接收两个参数

static void Main(string[] args)

{

    MyDel md=new MyDel(方法1);          //委托对象,其引用变量指向参数中的方法

    md+=new MyDel(方法2);

    md+=new MyDel(方法3);

    string result=md("张三","1234");   //调用委托对象,传递所指方法的参数

}

方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。

C# 2。0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。如:

using System;

class Name

{

    private string pName;

    //定义委托类型

    public delegate void myEventHandler(object sender, NameEventArgs e);

    //定义Get事件

    public event myEventHandler Get;

    internal string Text

    {

        get { return this.pName; }

        set{

            //-----------------------------------------------------------2

            this.pName=value;

            this.OnGet(new NameEventArgs("Text属性被更改了"));

        }

    }

    void OnGet(NameEventArgs e)//----------------------------------------3

    {

        this.Get(this, e);  //触发事件

    }

    public override string ToString()

    {

        return "Name类的对象";

    }

    public class NameEventArgs : EventArgs  //自定义事件信息类

    {

        string pArgs;

        public NameEventArgs(string s)

        {

            pArgs = s;

        }

        public override string ToString()

        { return pArgs; }

    }

}

class EventDel

{

    static void Main(string[] args)

    {

        Name myname = new Name();

        myname.Get += new Name.myEventHandler(myname_get); //--------------4

        myname.Text = "张三";//--------------------------------------------1

    }

    //用于订阅事件的myname_get()方法

    static void myname_get(object sender, Name.NameEventArgs e) //---------5

    {

        //输出事件信息,和事件发布者的属性

        Console.WriteLine("事件信息:{0}", e.ToString());

        Console.WriteLine("事件发布者:{0}", sender.ToString());

        Console.WriteLine("你输入的名字是:{0}",((Name)sender).Text);

    }

}

结果:

事件信息:Text属性被更改了

事件发布者:Name类的对象

你输入的名字是:张三

请按任意键继续. . .

使用匿名方法,直接将方法体的代码和委托对象关联而不需要单独定义此方法

class EventDel

{

     static void Main(string[] args)

    {

         Name myname=new Name();

        myname.Get += delegate(object sender, Name.NameEventArgs e)

        {

        };

    }

}

也可以用Lambda表达式把delegate隐藏

class EventDel

{

     static void Main(string[] args)

    {

         Name myname=new Name();

        myname.Get += (object sender, Name.NameEventArgs e) =>

        {

        };

    }

}

 

 

事件是不是一种委托?

委托是一种安全的函数指针,事件是一种消息机制

委托与事件是什么关系?为什么要使用委托

    委托提供了封装方法的方式,事件是某动作已发生的说明,事件是建立于委托之上

    程序运行时同一个委托能够用来调用不同的方法,只要改变它的引用方法即可,因此委托调节器用的方法不是在编译时决定的,而是在运行时确定的.

请解释这种语法现象Session[“name”]=20;

    给类的索引器赋值.

ASP.Net的身份验证方式有哪些?分别是什么原理?

Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",

window验证: ASP.NET 会结合信息服务 (IIS),为每个用户开启window帐号,验证其身份,安全性较高。

forms验证:为每个登陆用户写入一个身份验证票据,在web使用最广的验证方式,灵活方便。

passport验证:由 Microsoft 提供的集中身份验证服务,该服务为成员站点提供单一登录和核心配置

什么是code-Behind技术。

就是代码隐藏,在ASP.NET中通过ASPX页面指向CS文件的方法实现显示逻辑和处理逻辑的分离,这样有助于web应用程序的创建。比如分工,美工和编程的可以个干各的,不用再像以前asp那样都代码和html代码混在一起,难以维护。

新建一个VS.Net下的项目。。看到ASPXRESXCS三个后缀的文件,这个就是代码分离。实现了HTML代码和服务器代码分离,方便代码编写和整理。

活动目录。

活动目录是window2000的最重要的功能。可以将用户信息全部集成起来,登陆以后可以访问多个不同的网络服务。。

活动目录包括两个方面:目录和与目录相关的服务。安装了活动目录的计算机称为域控制器,对于用户而言,只要加入并接受域控制器的管理就可以在一次登录之后全网使用,方便地访问活动目录提供的网络资源。对于管理员,则可以通过对活动目录的集中管理就能够管理全网的资源。

.Net中读写XML的类都归属于哪些命名空间?

System.XML命名空间,任何类型的项目都可以通过System.XML命名空间进行XML处理。使用System.Xml命名空间中的XmlDocument类来操作xml的数据

C# Socket所在的命名空间是?

System.Net.Sockets。 Socket 类为网络通信提供了一套丰富的方法和属性。Socket 类允许您使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输。

什么是SOAP,有哪些应用。

SOAPSimple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息。

SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。

如何理解.Net中的垃圾回收机制。

垃圾回收器每次进行垃圾回收时,对堆上的对象进行检查,把没有被任何变量引用的对象销毁。但并不是检查堆上的每个对象,而是将对象进行分类,将所有对象分类三代(generation)。生命周期越短(新创建的对象)代数越小,反之越大。

在堆空间不够用时,垃圾回收器回收垃圾,检查第0代对象,如果发现没有被引用的对象,则标记这些为“垃圾”,并销毁。而幸存的部分的第0代对象将升级为第1代对象,某些标记为“垃圾”的对象也会幸存而升级。这时如果堆空间仍然不够用(如创建比较大的新对象),垃圾收集器将会检查第1代对象,将没有引用的对象进行销毁。幸存部分升级为第2代对象,当内存堆空间仍然不够用时,检查第2代对象,不过第2代对象检查后仍然是第2代对象,不会继续升级。

 

如果发现内存不够,则垃圾回收器,将全部对象作为无效对象(被回收对象),然后先将全局变量,static,处于活动中的局部变量,以及当前CG指针指向的对象放入一个表中。然后会搜索新列表中的对象所引用的对象,加入列表中,其他没有被加入列表的对象都会被回收。

垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

    三个generation,当每个generation内存满了的时候检查引用,无引用就回收内存

常用的调用webservice方法有哪些?

1.使用WSDL.exe命令行工具。

2.使用VS.NET中的Add Web Reference菜单选项

什么是XML?列举一下你所了解的XML技术及其应用

    XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XMLXSLXPath等。

    xml可以用来做网页(xslt)xml可以当作数据库;xml可以用来保存对象的系列化;xml用于配置;用于保存静态数据类型。接触XML最多的是web Servicesconfig

XML HTML 的主要区别

1. XML区分大小写字母的,HTML不区分。

2. XML中,绝对不能省略掉结束标记。在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束 标记。

3. XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。

4. XML中,属性值必须在引号中。在HTML中,引号是可用可不用的。

5. XML中,所有的属性都必须带有相应的值。在HTML中,可以拥有不带值的属性名。

C#propertyattribute的区别,他们各有什么用处,这种机制的好处在哪里?

    property和attribute汉语都称之为属性。

    property一个是属性,用于存取类的字段,类向外提供的数据区域,

    attribute一个是特性,用来标识类,方法等的附加性质, 描述对象在编译时或运行时属性的.

C#可否对内存进行直接的操作?

    这个问题比较难回答,也是个很大的问题。但是可以这样问答。C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针的,在用的时候需要在前边加unsafe,,在.net中使用了垃圾回收机制(GC)功能,它替代了程序员,不过在C#中不可以直接使用finalize方法,而是在析构函数中调用基类的finalize()方法。

用最有效的方法算出23次方8等于几?

2<<3.

维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么

触发器,性能好,事务性

ADO.NET相对于ADO等主要有什么改进?

    简单的说,ADO.NET新增dataset等,不需要随时保持连接,性能提高.

1:ADO.Net不依赖于ole db提供程序,而是使用.net托管提供的程序,

2:不使用com

3:不在支持动态游标和服务器端游

4:,可以断开connection而保留当前数据集可用

5:强类型转换

6:xml支持

    您可以通过将 ADO.NET 的各项功能与 ActiveX 数据对象 (ADO) 的特定功能进行比较来理解 ADO.NET 的功能。

         1、数据的内存中表示形式

    在 ADO 中,数据的内存中表示形式为记录集。在 ADO.NET 中,它为数据集。它们之间有重要的差异。

         2、表的个数

    记录集看起来像单个表。如果记录集将包含来自多个数据库表的数据,则它必须使用 JOIN 查询,将来自各个数据库表的数据组合到单个结果表中。 相反,数据集是一个或多个表的集合。数据集内的表称为数据表;明确地说,它们是 DataTable 对象。如果数据集包含来自多个数据库表的数据,它通常将包含多个 DataTable 对象。即,每个 DataTable 对象通常对应于单个数据库表或视图。这样,数据集可以模仿基础数据库的结构。

    数据集通常还包含关系。数据集内的关系类似于数据库中的外键关系,即它使多个表中的行彼此关联。例如,如果数据集包含一个有关投资者的表和另一个有关每个投资者的股票购买情况的表,则数据集可能还包含一个关系来连接投资者表的各个行和购买表的对应行。

    由于数据集可以保存多个独立的表并维护有关表之间关系的信息,因此它可以保存比记录集丰富得多的数据结构,包括自关联的表和具有多对多关系的表。

         3、数据导航和游标

    在 ADO 中,您使用 ADO MoveNext 方法顺序扫描记录集的行。在 ADO.NET 中,行表示为集合,因此您可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation 对象维护有关主记录和详细资料记录的信息,并提供方法使您可以获取与正在操作的记录相关的记录。例如,从 Investor 表的"Nate Sun"的行开始,可以定位到 Purchase 表中描述其购买情况的那组行。

         "游标"是数据库元素,它控制记录导航、更新数据的能力和其他用户对数据库所做更改的可见性。ADO.NET 不具有固有的游标对象,而是包含提供传统游标功能的数据类。例如,在 ADO.NET DataReader 对象中提供只进、只读游标的功能。有关游标功能的更多信息,请参见数据访问技术。

         4、将打开连接的时间降至最低

    在 ADO.NET 中,打开连接的时间仅足够执行数据库操作,例如"选择"(Select) "更新"(Update)。您可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。

    在 ADO 中,记录集可以提供不连接的访问,但 ADO 主要是为连接的访问设计的。

         ADO ADO.NET 中的不连接处理之间存在一个显著差异。在 ADO 中,通过调用 OLE DB 提供程序来与数据库通信。但在 ADO.NET 中,您通过数据适配器(OleDbDataAdapterSqlDataAdapterOdbcDataAdapter OracleDataAdapter 对象)与数据库通信,这将调用 OLE DB 提供程序或基础数据源提供的 APIADO ADO.NET 之间的主要区别在于:

    在 ADO.NET 中,数据适配器允许您控制将对数据集所做的更改传输到数据库的方式,方法是实现性能优化、执行数据验证检查或添加其他任何额外处理。

    注意:数据适配器、数据连接、数据命令和数据读取器是组成 .NET Framework 数据提供程序的组件。Microsoft 和第三方供应商可能会提供其它提供程序,这些提供程序也可集成到 Visual Studio 中。有关不同 .NET 数据提供程序的信息,请参见 .NET 数据提供程序。

         5、在应用程序间共享数据

    在应用程序间传输 ADO.NET 数据集比传输 ADO 不连接的记录集要容易得多。若要将 ADO 不连接的记录集从一个组件传输到另一个组件,请使用 COM 封送。若要在 ADO.NET 中传输数据,请使用数据集,它可以传输 XML 流。 相对于 COM 封送,XML 文件的传输提供以下便利之处:

 

更丰富的数据类型 COM 封送提供一组有限的数据类型(由 COM 标准定义的那些类型)。由于 ADO.NET 中的数据集传输基于 XML 格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。

         6、性能

    传输大型 ADO 记录集或大型 ADO.NET 数据集会使用网络资源;随着数据量的增长,施加于网络的压力也在增加。ADO ADO.NET 都使您可以最大限度地降低所传输的数据。但

         ADO.NET 还提供另一个性能优势:ADO.NET 不需要数据类型转换。而需要 COM 封送来在组件间传输记录集的 ADO,则需要将 ADO 数据类型转换为 COM 数据类型。

         7、穿透防火墙

    防火墙可以影响试图传输不连接的 ADO 记录集的两个组件。请记住,防火墙通常配置为允许 HTML 文本通过,但防止系统级请求(如 COM 封送)通过。 因为组件使用 XML 交换 ADO.NET 数据库,所以防火墙可以允许数据集通过。

ASP.NetASP相比,主要有哪些进步?

asp解释型,aspx编译型,性能提高,有利于保护源码

ASP的缺点:

l  VBScriptJavaScript是在ASP中仅可使用的两种脚本语言。它们是基本的非类型化语言。在ASP中不能使用强类型语言.

l  ASP页面需要解释,使得它执行速度较慢。

l  ASP页面非常凌乱。

在使用ASP创建WEB应用程序时,程序员和设计人员必须在同一文件上一起工作。

ASP中,必须通过编写代码来提供所需的任何功能。

ASP中没有对代码给予太多的关注。

ASP中没有调试机制。

ASP中。必须停止WEB服务器才能安装DLL的新版本,并且在应用程序中使用DLL的新版本之前,必须先在注册表中注册它,而且,DLL注册过程非常复杂。

ASP.NET的优点:

l  ASP.Net中支持强类型语言.

l  ASP.Net页将被编译而不是解释,这样它们的执行速度就比ASP页快。

l  ASP.Net提供声明性服务器控件。

l  ASP.Net通过继承机制来支持代码的重用。

l  ASP.Net具有Trace的内置方法,可以帮助对页面进行调试。

ASP.Net中,置于应用程序的BIN目录中的任何组件将自动对应用程序可用.

你对XMLHTTPWEBSERVICE了解吗?简单描述其特点、作用

xmlhttp可以主动获取远端web代码,类似HttpWebRequest

存储过程和函数的区别

存储过程是编译好的存储在数据库的操作,函数不用说了。

Session,ViewState,Application,cookie的区别?

Session:用于保持状态的基于 Web 服务器的方法。Session 允许通过将对象存储在Web 服务器的内存中在整个用户会话过程中保持任何对象。主要用于保持代码隐藏类中对象的状态。为每个用户创建的,用于存储单个用户,因为他是相对每个用户的.所以可能来取得在线人数等。

ViewState:主要用于保持 Web 页上控件的状态。当 Web 页上的控件被绑定到代码隐藏类中的对象。

Application用于存储所有用户都可视的信息.所以它存储的是要让所有用户共享的一些信息.如总访问数等Cache,页面缓存。

Cookie:通常我们都把它放在客户端,也可以存储在服务器端。主要用它存储用户的个性设制,和登陆信息。

请说明在.Net中常用的几种页面间传递参数的方法,并说出他们的优缺点。

1、queryString  url参数 简单,显示于地址栏,长度有限

优点:简单易用;资源占用比较少。

缺点:传递数据大小有限制,只能传递基本类型的数据,安全性差

2、session(viewstate)

优点:简单,灵活性强,能传递复杂的对象

缺点:但易丢失,资源消耗大

3、cookie

优点:简单,

缺点:但可能不支持,可能被伪造,大小有限制不能超过4KB 不恩能够存储复杂对象

4、this.Server.Transfer,

优点:URL地址不变,安全性高,灵活性强,能传递复杂的对象

缺点:资源消耗大

5、hidden control/viewstate  简单,可能被伪造

6、static member。 

7、cache 

8、application

优点:全局

缺点:资源消耗大

9、DataBase  数据库 稳定,安全,但性能相对弱

10、xml or other   Files 

11、XMLHTTP or Hidden iFrame/frame 

12、Context.user.identity 

    我正在做一个通用提示页面,所有页面出现问题都要,传递几个变量字符串到同一个页面 hitMsgaspx变量字符串包括提示语言,即将跳转的页面,跳转时间。在上面的种方案中哪个更好些

   (1)queryString的毛病是无法传递很长字符串,比如系统错误信息往往就一整个屏幕。  

   (2)session的毛病是不能过多使用,容易丢失。  

   (3)cookie的毛病是依赖客户端设置,不可靠。  

   (4)server.transfer的毛病是接收页面要为发送页面准备好,只能定制专门一个页面接受定制好的页面。不能是一个页面接受任何页面。  

   (5)hidden control/viewstate只能传递本页。除非特殊制作。  

   (6)static member。无法保证线程安全,可能会此处栽瓜他处得豆。  

   (7)cache不适合使用一次就扔的变量。  

   (8)application全局的,开销大。  

   (9)DataBase全局固化的,开销更大,除非做日志跟踪。  

   (10)xml or othe Files全局固化的,开销大,除非做日志跟踪。  

   (11)XMLHTTP or Hidden iFrame/frame,做这个过于烦琐。  

   (12)Context这个占用了用户id,不适合做这个。

如果在一个B/S结构的系统中需要传递变量值,但是又不能使用SessionCookieApplication,您有几种方法进行处理?

input type="hidden" 简单,可能被伪造

url参数 简单,显示于地址栏,长度有限

数据库 稳定,安全,但性能相对弱

this.Server.Transfer,在新页面获得值的代码如下:

if (Page.PreviousPage != null)

{

    TextBox st =

        (TextBox)Page.PreviousPage.FindControl("TextBox1");

    if (st != null)

    {

        Label1.Text = SourceTextBox.Text;

    }

}

ASP.NET页面跳转的几种方法

超链接跳转

<a>标签

1. <a href=”test.aspx”></a>

2.这是最常见的一种转向方法;

HyperLink控件

1.Asp.net 服务器端控件属性NavigateUrl指定要跳转到的Url地址

2. NavigateUrl是可以在服务器端使用代码修改,这个区别于<a>

3.由于HyperLink本身没有事件所以要在服务器端其它事件中设置NavigateUrl

4.代码示例

<Asp:HyperLink id=”hyperlink” runat=”server” NavigatoeUrl=”test.aspx”>

ok</Asp:HyperLink>

Response.Redirect()方法

1.过程:发送一个Http响应到客户端,通知客户端跳转到一个新的页面,然后客户端再发送跳转请求到服务器端。

2.页面跳转之后内部控件保存的所有信息丢失,当A跳转到B,B页面将不能访问A页面提交的数据信息。

3.使用这个方法使用这个方法跳转后浏览器地址栏的Url信息改变

4.可以使用Session Cookies Application等对象进行页面间的数据传递

5.重定向操作发生在客户端,总共涉及到两次与Web服务器的通信:一次是对原始页面的请求,另一次是重定向新页面的请求


Server.Transfer()方法

1.实现页面跳转的同时将页面的控制权进行移交

2.页面跳转过程中Request Session等保存的信息不变,跳转之后可以使用上一个页面提交的数据

3.跳转之后浏览器地址栏的Url不变

4.这种方法的重定向请求是在服务器端的进行的,浏览器不知道页面已经发生了一次跳转

Server.Execute()方法

1.该方法允许当前页面执行同一个Web服务器上的另一个页面

2.页面执行完毕之后重新回到原始页面发出Server.Execute()的位置。

3.这种方式类似针对页面的一次函数调用被请求的页面可以使用原始页面的表单数据和查询字符串集合

4.被调用页面的Page指令的EnableViewStateMac属性设置为False

通过超链接怎样传递中文参数?

URLEncode URLDecode

请说出强名的含义

对程序集,进行公钥/私钥对签名,称为强名。用名称,版本,文化,公钥唯一确定程序集

具有自己的key,可以在GAC为公用

请列出c#中几种循环的方法,并指出他们的不同

For :使用于确定次数的循环

Foreach:使用于遍历的元素只读

While:次数不确定条件随机变化

Do…while:次数不确定条件随机变化,但至少要保证能被执行一次

请指出.Net中所有类型的基类

Object

C#中有没有运算符重载?能否使用指针?

    有,重载操作符意味着使该操作符具有不同的行为;使用操作符可以使方程式简单易懂;重载运算符使用operator关键字来创建一个运算符方法,只能在类或结构中使用 Operator

    例:下面的代码示例使用 Operator 语句定义一个结构的大纲,该结构包括 AndOr运算符的运算符过程。And Or 每个都采用两个类型为 abc 的操作数,并返回类型 abc。这些定义允许调用代码通过 abc 类型的操作数来使用 AndOr

Public Structure abc

    Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc

        Dim r As New abc

        ' Insert code to calculate And of x and y.

        Return r

    End Operator

    Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc

        Dim r As New abc

        ' Insert code to calculate Or of x and y.

        Return r

    End Operator

End Structure

    能使用指针, C# 中很少需要使用指针,但仍有一些需要使用的情况。例如,在下列情况中使用允许采用指针的不安全上下文是正确的:

处理磁盘上的现有结构

涉及内部包含指针的结构的高级 COM 或平台调用方案

性能关键代码

    不鼓励在其他情况下使用不安全上下文。具体地说,不应该使用不安全上下文尝试在 C# 中编写 C 代码。

posted on 2011-04-14 23:23  tigerhuolh  阅读(311)  评论(0编辑  收藏  举报

导航