您的位置:首页 > 编程学习 > 面试 > 正文

ASP.NET常见面试题

更多 时间:2014-12-3 类别:编程学习 浏览量:1326

ASP.NET常见面试题

ASP.NET常见面试题

1、ADO.NET中Connection、Command、DataAdapter、DataSet、DataReader

Connection:主要是开启程序和数据库之间的连接。没有利用连接对象将数据库打开,是无法从数据库中取得数据的。Close和Dispose的区别,Close以后还可以Open,Dispose以后则不能再用。

Command:主要可以用来对数据库发出一些指令,例如可以对数据库下达查询、新增、修改、删除数据等指令,以及调用存在数据库中的存储过程等。这个对象是架构在Connection 对象上,也就是Command 对象是透过连接到数据源。

DataAdapter:主要是在数据源以及DataSet 之间执行数据传输的工作,它可以透过Command 对象下达命令后,并将取得的数据放入DataSet 对象中。这个对象是架构在Command对象上,并提供了许多配合DataSet 使用的功能。

DataSet:这个对象可以视为一个暂存区(Cache),可以把从数据库中所查询到的数据保留起来,甚至可以将整个数据库显示出来,DataSet是放在内存中的。DataSet 的能力不只是可以储存多个Table 而已,还可以透过DataAdapter对象取得一些例如主键等的数据表结构,并可以记录数据表间的关联。DataSet 对象可以说是ADO.NET 中重量级的对象,这个对象架构在DataAdapter对象上,本身不具备和数据源沟通的能力;也就是说我们是将DataAdapter对象当做DataSet 对象以及数据源间传输数据的桥梁。DataSet包含若干DataTable、DataTableTable包含若干DataRow。

DataReader:当我们只需要循序的读取数据而不需要其它操作时,可以使用DataReader 对象。DataReader对象只是一次一笔向下循序的读取数据源中的数据,这些数据是存在数据库服务器中的,而不是一次性加载到程序的内存中的,只能(通过游标)读取当前行的数据,而且这些数据是只读的,并不允许作其它的操作。因为DataReader 在读取数据的时候限制了每次只读取一笔,而且只能只读,所以使用起来不但节省资源而且效率很好。使用DataReader 对象除了效率较好之外,因为不用把数据全部传回,故可以降低网络的负载。

 

2、override与重载的区别

重载是方法的名称相同,参数或参数类型不同,进行多次重载以适应不同的需要;
Override 是进行基类中函数的重写,为了适应需要。

 

3、编程实现一个快速排序算法

  •  
  • C# 代码   复制
  • 
    
            public class QuickSort
            {
    
                /**//// <summary> 
    
                /// 排序 
    
                /// </summary> 
    
                /// <param name="numbers">待排序数组</param> 
    
                /// <param name="left">数组第一个元素索引Index</param> 
    
                /// <param name="right">数组最后一个元素索引Index</param> 
    
                private static void Sort(int[] numbers, int left, int right)
                {
    
                    //左边索引小于右边,则还未排序完成 
    
                    if (left < right)
                    {
    
                        //取中间的元素作为比较基准,小于他的往左边移,大于他的往右边移 
    
                        int middle = numbers[(left + right) / 2];
    
                        int i = left - 1;
    
                        int j = right + 1;
    
                        while (true)
                        {
    
                            while (numbers[++i] < middle) ;
    
                            while (numbers[--j] > middle) ;
    
                            if (i >= j)
    
                                break;
    
                            Swap(numbers, i, j);
    
                        }
    
                        Sort(numbers, left, i - 1);
    
                        Sort(numbers, j + 1, right);
    
                    }
    
                }
    
                /**//// <summary> 
    
                /// 交换元素值 
    
                /// </summary> 
    
                /// <param name="numbers">数组</param> 
    
                /// <param name="i">当前左边索引</param> 
    
                /// <param name="j">当前右边索引</param> 
    
                private static void Swap(int[] numbers, int i, int j)
                {
    
                    int number = numbers[i];
    
                    numbers[i] = numbers[j];
    
                    numbers[j] = number;
    
                }
    
                public static void Main()
                {
    
                    int[] max = { 6, 5, 2, 9, 7, 4, 0 };
    
                    Sort(max, 0, max.Length - 1);
    
                    StringBuilder temp = new StringBuilder();
    
                    for (int i = 0; i < max.Length; i++)
                    {
    
                        temp.Append(max[i].ToString() + ",");
    
                    }
    
                    Console.WriteLine(temp.ToString().Substring(0, temp.Length - 1));
    
                    Console.ReadLine();
    
                }
    
            } 
    
    		
  • 4、什么是装箱(boxing)和拆箱(unboxing)

    装箱:从值类型接口转换到引用类型。

    拆箱:从引用类型转换到值类型。

     

    5、在下面的例子里

     

  • C# 代码   复制
  • 
      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

     

    6、(class)与结构(struct)的区别

    Class可以被实例化,属于引用类型,是分配在内存的堆上的。类是引用传递的。

    Struct属于值类型,是分配在内存的栈上的。结构体是复制传递的。

    Int32、Boolean等都属于结构体。

     

    7、堆和栈的区别

    栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;局部值类型变量、值类型参数等都在栈内存中。

    堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

     

    8、能用foreach遍历访问的对象的要求

    需要实现IEnumerable接口或声明GetEnumerator方法的类型。

     

    9、C#中的接口和类有什么异同

    不同点:

    不能直接实例化接口。

    接口不包含方法的实现。

    接口可以多继承,类只能单继承。

    类定义可在不同的源文件之间进行拆分。

    相同点:

    接口、类和结构都可以从多个接口继承。

    接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

    接口和类都可以包含事件、索引器、方法和属性。

     

    10、abstract classinterface有什么区别

    接口支持多继承;抽象类不能实现多继承。

    接口只能定义行为;抽象类既可以定义行为,还可能提供实现。

    接口可以用于支持回调(CallBack);抽象类不能实现回调,因为继承不支持。

    接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;

    抽象类可以定义字段、属性、包含有实现的方法。

    接口可以作用于值类型(Struct)和引用类型(Class);抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

     

    11、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

    short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。

    short s1 = 1; s1 += 1正确。

     

    12、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行?

    会执行,在return前执行。

    例如

  •  
  • C# 代码   复制
  • 
    public int QueryCount()
    
    {
    
       …..
    
       try
    
       {
    
          return cmd.ExecuteScalar();
    
       }
    
       finally
    
       {
    
          cmd.Dispose();
    
       }
    
    }
    
    		

  • 13、什么是强类型,什么是弱类型?

    强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。

    强类型安全,因为它事先已经确定好了,而且效率高。弱类型更灵活,但是效率低,而且出错概率高 。

     

    14、产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复

  •  
  • C# 代码   复制
  • 
    int[] intArr=new int[100];
    ArrayList myList=new ArrayList();
    Random rnd=new Random();
    while(myList.Count<100)
    {
       int num=rnd.Next(1,101);
       if(!myList.Contains(num))
           myList.Add(num);
    }
    for(int i=0;i<100;i++)
      intArr=(int)myList;
    
    		
  • 15、什么是反射

    程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例

     

    16、Assembly.Load("foo.dll"); 这句话是否正确?

    错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll");

     

    17、下列关于C#中索引器理解正确的是( c )

    a) 索引器的参数必须是两个或两个以上  
    b) 索引器的参数类型必须是整数型  
    c) 索引器没有名字  
    d) 以上皆非  

     

    18、请叙述const与readonly的区别

    const 关键字用于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常数声明引入给定类型的一个或多个常数。

    const数据成员的声明式必须包含初值,且初值必须是一个常量表达式。因为它是在编译时就需要完全评估。

    const成员可以使用另一个const成员来初始化,前提是两者之间没有循环依赖。

    readonly在运行期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作推迟到运行期进行。

    readonly 关键字与 const 关键字不同: const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。另外,const 字段是编译时常数,而 readonly 字段可用于运行时常数。

    readonly 只能在声明时或者构造函数里面初始化,并且不能在 static 修饰的构造函数里面。

     

    标签:面试题