转 经典面试题2016——50题

1.面向对象语言具有——继承性——,——封装性——,——多态性——

   继承性:就是让一个类型的对象拥有另一个类型的对象的属性的方法。继承后,子类拥有父类的属性和方法。

   封装性:就是将数据和代码捆绑在一起,防止外界干扰。

   多态性:就是一个事物拥有不同形式的能力。

 

2.简述 private、 protected、 public、 internal 修饰符的访问权限。

答 . private :   私有成员, 在类的内部才可以访问。

     protected : 保护成员,该类内部和继承类中可以访问。

     public :    公共成员,完全公开,没有访问限制。

     internal:  是同一程序集中文件才可访问的。

 

3.列举asp.net页面传值的几种方法?

1. 使用QueryString变量
QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
string s_url;
s_url = "b.aspx?name=" + Label1.Text;
Response.Redirect(s_url);
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
Label2.Text = Request.QueryString["name"];
}

2. 使用Application 对象变量
Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock和UnLock。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
Application["name"] = Label1.Text;
Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
Application.Lock();
name = Application["name"].ToString();
Application.UnLock();
}

3. 使用Session变量
想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。
a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
Session["name"] = Label.Text;
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Session["name"].ToString();
}

4. 使用Cookie对象变量
这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合ASP.NET内置对象Request来使用。

a.aspx的C#代码
private void Button1_Click(object sender, System.EventArgs e)
{
HttpCookie cookie_name = new HttpCookie("name");
cookie_name.Value = Label1.Text;
Reponse.AppendCookie(cookie_name);
Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
string name;
name = Request.Cookie["name"].Value.ToString();
}

5. 使用Server.Transfer方法
这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。
a.aspx的C#代码
public string Name
{
get{ return Label1.Text;}
}
private void Button1_Click(object sender, System.EventArgs e)
{
Server.Transfer("b.aspx");
}

b.aspx中C#代码
private void Page_Load(object sender, EventArgs e)
{
a newWeb; //实例a窗体
newWeb = (source)Context.Handler;
string name;
name = newWeb.Name;
}

 

4.经典递归算法:兔子繁殖问题。。。

class Program
    {
        public static int tuzi(int n)
            //静态函数才可以调用
        {
           
            if (n ==1|n==2)
            {
                return  1;
            }
            
            return (n - 2) + (n - 1);
        }
        static void Main(string[] args)
        {
            int b;
            Console.WriteLine("请输入几个月后的兔子:");
            int a = int.Parse(Console.ReadLine());
            b = tuzi(a);
            Console.WriteLine("兔子为{0}", b);
        }
    }

 

5.经典排序—冒泡排序法

  public static void bubble_sort(int[] x)
        {
            for (int i = 0; i < x.Length; i++)
            {
                for (int j = i; j < x.Length; j++)
                {
                    if (x[i] < x[j])    //从大到小排序
                    {
                        int temp;
                        temp = x[i];
                        x[i] = x[j];
                        x[j] = temp;
                    }
                }
            }
        }
        static void Main(string[] args)
        {
            int[] huage = { 1, 5, 2, 9, 3, 7, 6,4,8,0};
            bubble_sort(huage);
            foreach (var a in huage)
            {
                Console.WriteLine(a );
            }
        }

 

6.C#中的委托是什么?事件是委托吗?

委托是将一种方法作为参数代入到另一种方法。

是,事件是一种特殊的委托。  //比如:onclick事件中的参数就是一种方法。

 

7.委托声明的关键字是__delegate__.

 

8.根据委托(delegate)的知识,请完成以下用户控件中代码片段的填写:

namespace test

{

public delegate void OnDBOperate();

public class UserControlBase : System.Windows.Forms.UserControl

{

 public event OnDBOperate   OnNew

 

privatevoidtoolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgs e)

{

if(e.Button.Equals(BtnNew))

{

//请在以下补齐代码用来调用OnDBOperate委托签名的OnNew事件。

}

}

}

答:if( OnNew != null )

    OnNew( this, e );

 

9.c#中的三元运算符是__?:_(条件运算符)_

 

10.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。

答:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。

 

11.overload与override的区别。

 overload是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要, overloaded的方法是可以改变返回值的类型

 override 是进行基类中函数的重写。实现多态。

 

12.构造器(构造函数)Constructor是否可被override?

答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

 

13.下面的代码中有什么错误吗?____abstract override是不可以一起修饰______

using System;

class A

{

public virtual void F(){

Console.WriteLine(“A.F“);

}

}

abstract class B:A

{

public abstract override void F();

}

 

14.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty

      foreach (System.Windows.Forms.Control control in this.Controls)

      {

 if (control is System.Windows.Forms.TextBox)

 {

     System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ;

     tb.Text = String.Empty ;

 }

      }

 

15.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?

使用三层架构模式分层

一般为3层

        数据访问层,业务层,表示层。

 数据访问层对数据库进行增删查改。

 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。

 表示层为了与用户交互例如用户添加表单。

优点:  分工明确,条理清晰,易于调试,而且具有可扩展性。

缺点:  增加成本。

 

16.net中读写数据库需要用到那些类?他们的作用?

DataSet:数据集。

DataCommand:执行语句命令。

DataAdapter:数据的集合,用语填充。

DataReader:数据只读器

 

17.ADO.net中常用的对象有哪些?分别描述一下。

Connection 数据库连接对象

Command 数据库命令 

DataReader 数据读取器

DataSet 数据集

DataAdaprer数据适配器

 

18.DataReader与Dataset有什么区别?

一个是只能向前的只读游标,一个是内存中的表。

 

19.在.net中,配件的意思是?

程序集。(中间语言,源数据,资源,装配清单)

 

20.请详述在.net中类(class)与结构(struct)的异同?

class属于引用类型,是分配在内存的堆上的,class可以被实例化,可以实现接口和单继承其他类,还可以作为基类型

struct属于值类型,是分配在内存的栈上的,不能作为基类型,但是可以实现接口.

 

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

Windwos(默认)用IIS控制

From(窗体)用帐户

Passport(密钥)

 

22.net Remoting 的工作原理是什么?

服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。

 

23.简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。

webservice主要是可利用HTTP,穿透防火墙。而Remoting可以利用TCP/IP,二进制传送提高效率。

 

24.什么是ASP.net中的用户控件?

用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多

 

25.在Asp.net中所有的自定义用户控件都必须继承自__Control___?

 

26.在.Net中,类System.Web.UI.Page 可以被继承么?_可以___(可以or不可以)

 

27.大概描述一下ASP.NET服务器控件的生命周期

答:初始化  加载视图状态  处理回发数据  加载  发送回发更改通知  处理回发事件  预呈现  保存状态  呈现  处置  卸载

 

28.net的错误处理机制是什么?

答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

 

29.在.Net托管代码中我们不用担心内存漏洞,这是因为有了__GC__(内存回收机制)___?

 

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

在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员  不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

 

31.在.Net中所有可序列化的类都被标记为__[Serializable]_______?

 

32.大概描述一下ASP。NET服务器控件的生命周期

答:初始化  加载视图状态  处理回发数据  加载  发送回发更改通知  处理回发事件  预呈现  保存状态  呈现  处置  卸载
 

33.什么是装箱与拆箱?

装箱是将值类型转换为引用类型 ;拆箱是将引用类型转换为值类型
      利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换,将值类型与引用类型链接起来
例如:
int val = 100;
object obj = val;
Console.WriteLine (“对象的值 = {0}", obj);
这是一个装箱的过程,是将值类型转换为引用类型的过程

int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine ("num: {0}", num);
这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程

 

34.堆和栈的区别?

    栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。

    堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

 

35.写出一条Sql语句: 取出表A中第31到第40记录(SQLServer, 以自动增长的ID作为主键,  注意:ID可能不是连续的。)

select top 10 * from A where id not in (select top 30 id from A)

select top 10 * from A where id (select max(id) from (select top 30 id from A )as A)

 

36.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号

Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1)

 

37.什么叫做SQL注入,如何防止?请举例说明

答:利用sql关键字对网站进行攻击。过滤关键字'等

 

38.如何处理几十万条并发数据?

答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.

 

39.请将字符串"I am a student"按单词逆序输出 如"student a am I"

string S = "I am a student";

            char[] C = new char[] { ' '};

            string[] n =S.Split(C);

            int length = S.Length;

            for (int i =length-1 ; i >=0; i--)

            {

                Console.Write(n[i]);

                if (i != 0)

                {

                    Console.Write(" ");

                }

            }

40.两个数组  [n] [m]  n>m  第一个数组的数字无序排列 第二个数组为空 取出第一个数组的最小值 放到第二个数组中第一个位置, 依次类推. 不能改变A数组,不能对之进行排序,也不可以倒到别的数组中。

  int[] a = { -20, 9, 7, 37, 38, 69, 89, -1, 59, 29, 0, -25, 39, 900, 22, 13, 55 };

            int[] b = new int[10];

            int intTmp = a[0], intMaxNum;

            for (int i = 0; i < a.Length; i++)

            {

                intTmp = a[i] > intTmp ? a[i] : intTmp;

            }

            intMaxNum = intTmp;

            for (int j = 0; j < b.Length; j++)

            {

 

                for (int i = 0; i < a.Length; i++)

                {

                    if (j == 0)

                        intTmp = a[i] < intTmp ? a[i] : intTmp;

                    else

                    {

                        if (a[i] > b[j - 1])

                            intTmp = a[i] < intTmp ? a[i] : intTmp;

                    }

                }

                b[j] = intTmp;

                intTmp = intMaxNum;

            }

            foreach (int bb in b)

            {

                Console.WriteLine(bb);

 

            }

            Console.ReadLine();

 

41.在下面的例子里

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=0

42.下面的例子中

using System;

class A

{

public static int X;

static A(){

X=B.Y+1;

}

}

class B

{

public static int Y=A.X+1;

static B(){}

static void Main(){

Console.WriteLine(“X={0},Y={1}“,A.X,B.Y);

}

}

产生的输出结果是什么?x=1,y=2

答:x=1,y=2

 

43.下面这段代码有错误么?

    switch (i){

    case():        答://case()条件不能为空

        CaseZero();

        break;

    case 1:

        CaseOne();

        break;

    case 2:

        dufault;   答://wrong,格式不正确

        CaseTwo();

        break;

   }

 

44.abstract class和interface有什么区别?

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成 员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以 在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从 接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

 

45.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

接口可以继承接口。

抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

 

46.能用foreach遍历访问的对象需要实现 ___IEnumerable___接口或声明_GetEnumerator___方法的类型。

 

47.请问: String类与StringBuilder类有什么区别?为什么在.Net类库中要同时存在这2个类?(简答)

     如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类。两个类的工作原理不同:String类是一种传统的修改字符串的方式,它确实可以完成把一个字符串添加到另一个字符串上的工作没错,但是在.NET框架下,这个操作实在是划不来。因为系统先是把两个字符串写入内存,接着删除原来的String对象,然后创建一个String对象,并读取内存中的数据赋给该对象。这一来二去的,耗了不少时间。而使用System.Text命名空间下面的StringBuilder类就不是这样了,它提供的Append方法,能够在已有对象的原地进行字符串的修改,简单而且直接。当然,一般情况下觉察不到这二者效率的差异,但如果你要对某个字符串进行大量的添加操作,那么StringBuilder类所耗费的时间和String类简直不是一个数量级的。
 

48.是否可以继承String类?

String类是密封类故不可以继承。

 

49.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?

  attribute:自定义属性的基类;property :类中的属性

 

50.软件开发过程一般有几个阶段?每个阶段的作用?

1.问题的定义及规划
此阶段是软件开发与需求放共同讨论,主要确定软件的开发目标及其可行性。
2.需求分析在确定软件开发可行性的情况下,对软件需要实现的各个功能进行详细需求分析。需求分析阶段是一个很重要的阶段,这一阶段做的好,将为整个软件项目的开发打下良好的基础。“唯一不变的是变化本身”,同样软件需求也是在软件爱你开发过程中不断变化和深入的,因此,我们必须定制需求变更计划来应付这种变化,以保护整个项目的正常进行。
3.软件设计此阶段中偶要根据需求分析的结果,对整个软件系统进行设计,如系统框架设计、数据库设计等。软件设计一般分为总体设计和详细设计。还的软件设计将为软件程序编写打下良好的基础。
4.程序编码此阶段是将软件设计的结果转化为计算机可运行的程序代码。在程序编码中必定要制定统一、符合标准的编写规范。以保证程序的可读性、易维护性。提高程序的运行效率。
5.软件测试在软件设计完成之后要进行严密的测试,一发现软件在整个软件设计过程中存在的问题并加以纠正。整个测试阶段分为单元测试、组装测试、系统测试三个阶段进行。测试方法主要有白盒测试和黑盒测试。

 

这些是C#,ASP.NET,数据库面试题,全部从网上收集而来,经整理而发表,希望给大家带来帮助,有错误的地方还请各位高手指出,在下倾听指教。

posted @ 2017-05-10 14:29  守夜人1  阅读(371)  评论(0编辑  收藏  举报