C#面试题-简单

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

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

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

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

  internal:在同一个程序集内可以访问。

2.private 私有成员会被继承吗?

  会,但是不能访问。所以看上去他们似乎是不能继承的,但实际上确实被继承了。

3.C#支持多重继承吗?

     不支持,但是可以用接口来实现。

4.C#中所有对象共同的基类是什么?

  Systm.Object。

5.什么是面向对象?

  万物都是对象,其主要特征:封装、继承、多态

6.怎样实现多态

  1.通过对象直接调用成员函数时,始终默认使用该对象的类的成员函数(除非用::显示指定类名)

  2.通过指向对象的指针或引用调用成员函数时,如果该函数是实函数,则调用该指针或引用的类的成员函数;如果该函数是虚函数,则调用该指针或引用指向的对象的类的成员函数。

7.什么是装箱和拆箱?

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

  装箱(boxing)是将值类型转换成引用类型,int i=3;object o=i;这便是装箱过程。

  而拆箱(unboxing)是将引用类型数据转换成值类型,int j=(int)o;

8.什么是Interface?它与Abstract Class有什么区别?

  接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类

9.什么时候使用抽象类,什么时候用接口

   接口用于规范,抽象类用于共性。接口中只能声明方法、属性、事件、索引器。而抽象类中可以有方法的实现,也可以定义非静态的类变量。抽象类是 类,所以只能被单继承,但是接口却可以一次实现多个。抽象了可以提供某些方法的部分实现,接口不可以。抽象类的实例是它的子类给出的。接口的实例是实现接 口的类给出的。在抽象类中假如一个方法,那么它的子类就同时有了这个方法。而在接口中加入新的方法,那么实现它的类就要重新编写(这就是为什么说接口是一 个类的规范了)。接口成员被定义为公共的,但抽象类的成员也可以是私有的、受保护的、内部的、或受保护的内部成员(其中受保护的内部成员只能在应用程序的 代码或派生类中访问)。

此外接口不能包含字段、构造函数、析构函数、静态成员或常量。

11.什么是抽象类(Abstract Class)?

  一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可以有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。

12.何时必须声明一个类为抽象类?

  当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

13.为什么不能指定接口中方法的修饰符?

  接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为共有方法。

14.如果接口中存在重复的方法名称该如何?

  这种情况中你可以决定如何实现,当然需要特别的小心。但是在编译环节是没有问题的。

15.C#接口和类有什么异同。

  异:

    不能直接实例化接口。

    接口不包含方法的实现。

    接口、类和结构可从多个接口继承。但是C#只支持单继承:类只能从一个基类继承实现。

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

  同:

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

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

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

    一个类可以实现多个接口。  

16.new 的两种用法

      实例化对象  new Class();        隐藏基类方法,即覆盖方法  public  new xxx(){}

17.委托与事件的用法

      public delegate void handles();   ////定义委托,返回值为void,没有参数

      public event handles eventhandels;  ///定一个委托类型的事件

     public void test()

     {

       ////another  code

     }

     Class.eventhandels=new handels(test);

18.传入某个属性的SET方法的隐含参数的名称是什么

     value ,它的类型和属性所声明的类型相同。

19.String与StringBuilder类有什么区别?为什么在.NET类库中要同时存在这两个类?

     StringBuilder比String更节约内存,所以StringBuilder更快

     String 对象是不可改变的。每次使用System.String类中的方法之一或进行运算时(如赋值、拼接等)时,都要在内存中创建一个新的字 符串对象,这就需要为该新对象分配  新的空间。而StringBuilder则不会。在需要对字符串执行重复修改的情况下,与创建新的String对象相关 的系统开销可能会非常昂贵。如果修改字符串而不创建新的对象,则可以使用System.Text.StringBuilder类。例如,当在一个循环中将 许多字符串连接在一起时,使用StringBuilder类可以提升性能。

20.在C#中,string str=null与string str=""请尽量使用文字或图像说明其中的区别。

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

21.Asp.Net 身份验证方式有那些?分别是什么原理?

     Windows(默认)    用IIS……Form(窗体)   用帐户……Passport(密钥)

22.是IIS中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate Server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件

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

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

24.DateTime是否可以为null?

     不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值为null

25.DateTime.Parse(myString);这行代码有什么问题?

     有问题,当myString不能鳗鱼事件格式要求的时候,会引发异常,建议使用DateTime.TryParse(),DateTime.TryParse()如果转换成功则输出日期,反之失败了,就返回null.

26.C#错误处理机制是

     采用try->catc->finally

27.为什么不提倡catch(Exception)

     try..catch在出现异常的时候影响性能,应该捕获更具体的异常,比如IOExeception,OutofMemoryException等

28.catch(Exception e){throw e;}和catch(Exception e){throw;}的区别

     前者将发生的异常对象抛出,而后者只是抛出异常,并没有抛出原异常对象

29.error和Exception的区别

     error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这种异常。

     exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生情况。

30.Static和非Static的区别:

     一.用Static声明的方法和变量,不需要实例化该类就调用;

     二.非Static的,就一定要用实例化的对象来调用,即用new来实例化。

31.C#提供一个默认的无参构造函数,当我实现了另外一个有一个参数的构造函数时,还想保留这个无参数的构 造函数。这样我应该写几个构造函数?
     两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参构造函数。

32.const和readonly有什么区别?

     const关键字用来声明编译时常量,readonly用来声明运行时常量。

33.用sealed修饰的类有什么特点

     sealed 修饰符用于防止从所修饰的类派生出其它类。如果一个密封类被指定为其他类的基类,则会发生编译时错误。

     密封类不能同时为抽象类。

     sealed修饰符主要用于防止非有意的派生,但是它还能促使某些运行时优化。具体来说,由于密封类用于不会有任何派生类,所以对密封类的实例的虚拟函数成员的调用可以转换为非虚拟调用来处理。

34.虚函数的用法
   virtual指明一成员函数为虚函数,而virtual仅用于类的定义里,在类外可不加此关键字。

  一个类的成员函数被定义为虚函数时,子类该函数仍保持虚函数特性。

  子类覆盖此函数时,定义里可不加virtual关键字,但函数声明要和基类的完全一致!且此声明是必须的。

  不是纯虚函数时,父类的虚函数必须要实现。而若将父类的虚函数设定为纯虚函数时,子类必须覆盖之而且必须要实现之。

35.解释virtual、sealed、override和abstract的区别

  virtual申明虚方法的关键字,说明该方法可以被重写

  sealed说明该类不可被继承

  override重写基类的方法

  abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由于子类实现,抽象类不可实例化。

36.重载和覆写有什么区别?

  重载是方法的名称相同,不同的参数类型,不同的参数个数,不同的参数顺序。覆写提供了子类中改变父类方法行为的实现(是进行基类中函数的重写)。

37.能够将非静态的方法覆写为静态方法吗?

  不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。

38.C#中委托是什么?事件是不是一种委托?

  委托可以把一个方法作为参数传递给另一个方法。委托可以理解为指向一个函数的引用。

  是的,是一种特殊的委托。

39.C#中的堆与栈

  栈(stack)由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈中清除。

  堆(Heap)中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象的引用,无则从堆中删除

40.对泛型的了解,和简单说明一下泛型有什么好处?

   泛型,通过参数化类型来实现在同一份代码上操作多种数据类型。利用参数化类型将类型抽象化,从而实现灵活的复用。

  好处是——类型安全,减少装箱和拆箱,提高性能,减少重复性的编程任务。

41.如何把一个Array复制到ArrayList中

            int[] a = new int[3] { 1, 2, 3 };

            ArrayList array = new ArrayList(a);

            array.AddRange(a);

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

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[i]=(int)myList[i];

 43.一个长度为10000的字符串,通过随机从a-z中抽取10000个字符组成。

StringBuilder sb = new StringBuilder(0, 10000);

        string strABC = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";

        string[] ABC = strABC.Split(',');

        int len = ABC.Length;

        Random rd = new Random();

        for (int i = 0; i < 10000; i++)

        {

            sb.Append(ABC[rd.Next(len)]);

        }

 44.请简述一下用Socket进行同步通讯编程的详细步骤

  • 在应用程序和远程设备中使用协议和网络地址初始化套接字
  • 在应用程序中通过指定端口和地址建立监听
  • 远程设备发出连接请求
  • 应用程序接受连接产生通信scoket
  • 应用程序和远程设备开始通讯(在通讯中应用程序将挂起直到通讯结束)
  • 通讯结束,关闭应用程序和远程设备的Socket回收资源

45.什么是强类型,什么是弱类型?哪种更好些?为什么?

   强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有 好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语 言,如c++,java,c#,pascal等,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如 javascript,vb等

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

foreach (Control control in this.Controls)

{

  if (control is TextBox)

  {

    TextBox tb = (TextBox)control ;

    tb.Text = String.Empty ;

  }

}

47.描述一下索引器的实现过程,是否只能根据数字进行索引?

  索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写。

  可以用任意类型。

48.什么叫应用程序域?

  .Net运行环境,CLR将程序分成一个或多个逻辑区就叫应用程序域AppDomain。

49.CTS、CLS、CLR分别作何解释?

  CTS:通用类型系统。CLS:通用语言规范。CLR:公共语言运行库。

50.什么是受管制的代码?

  unsafe:非托管代码。不经过CLR运行。

51.在.Net中配件的意思是?

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

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

     IEnumerable、GetEnumerator.

53.GC是什么?为什么要有GC?

  GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾手机,可以调用下面的方法之一:

  System.gc()

  Runtime.getRuntime().gc()

54.String s = new String("xyz");创建了几个String Object?
  两个对象,一个是“xyx”,一个是指向“xyx”的引用对像s。

55.构造器Constructor是否可被override?
  构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

56.是否可以继承String类?
  String类是final类故不可以继承。

57.两个对像值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
  不对,有相同的hash code。

58.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
  switch(expr1)中,expr1是一个整型,字符或字符串,因此可以作用在byte和long上,也可以作用在string上。

59.启动一个线程是用run()还是start()?
  启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

60.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
  不能,一个对象的一个synchronized方法只能由一个线程访问。

61.数组有没有length()这个方法? String有没有length()这个方法?  

   数组和string都没有Length()方法,只有Length属性。

62.sleep() 和 wait() 有什么区别?

  sleep()方法是将当前线程挂起指定的时间。   

  wait()释放对象上的锁并阻塞当前线程,直到它重新获取该锁。

63.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?   

   Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

64.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正确。

65.谈谈final, finally, finalize的区别。

   final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载。 finally-再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果有的话)。 finalize-方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对像从内存中清除出去之前做必要的清理 工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对像之前对这个对象调用的。

66.进程和线程的区别?   

  进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。

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

  需求分析,架构设计,代码编写,QA,部署

68.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.   

  string inputStr=" xx xx ";

  inputStr = Regex.Replace(inputStr.Trim(), @"\s+", " ");

69.什么是XML?   

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

70.c#中的三元运算符是?   

  ?:。

71.类成员有_____种可访问形式?   

  this.;new Class().Method;

72.float f=-123.567F; int i=(int)f;i的值现在是_____? 

  -123

73.在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?   

  GC。

74..在.Net中,类System.Web.UI.Page 可以被继承么?   

  可以。

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

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

76.HashMap和Hashtable的区别。
      答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable.

77.和&&的区别。
     &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).

78.写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。
     答:<script ***script>
     setTimeout('window.close();',3000);
     function show()
     {
       if (window.event.button == 1)
       {
         alert("左");
       }
       else if (window.event.button == 2)
       {
         alert("右");
       }
     }
     </script>

79.62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?
     答案:62移动成2的6次方

80.XML 与 HTML 的主要区别
     答:1. XML是区分大小写字母的,HTML不区分。
     2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束 标记。在XML中,绝对不能省略掉结束标记。
     3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
     4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
     5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

81.什么是SOAP,有哪些应用。

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

     SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。

     SOAP描述了把消息捆绑为XML的工作方式。它还说明了发送消息的发送方、消息的内容和地址以及发送消息的时间。SOAP是Web Service的基本通信协议。SOAP规范还定义了怎样用XML来描述程序数据(Program Data),怎样执行RPC(Remote Procedure Call)。大多数SOAP解决方案都支持RPC-style应用程序。SOAP还支持 Document-style应用程序(SOAP消息只包含XML文本信息)。

     最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。 

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

     SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点。 为此,它提供了一种基于 XML 且具有以下特性的消息处理框架: 1) 可扩展, 2) 可通过多种底层网络协议使用, 3) 独立于编程模型。

82.ADO.net中常用的对象有哪些?分别描述一下。
     答:Connection 数据库连接对像
     Command 数据库命令
     DataReader 数据读取器
     DataSet 数据集

83.列举一下你所了解的XML技术及其应用
     答:xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和config,soap协议

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

85.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
     答:string inputStr=" xx xx ";
     inputStr = Regex.Replace(inputStr.Trim(), @"\s+", " ");

86.DataReader与Dataset有什么区别?
     答:一个是只能向前的只读游标,一个是内存中的表。

87.向服务器发送请求有几种方式?
     答:get,post。get一般为链接方式,post一般为按钮方式。

88.请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。
     答:session(viewstate) 简单,但易丢失
     application 全局
     cookie 简单,但可能不支持,可能被伪造
     url参数 简单,显示于地址栏,长度有限
     数据库 稳定,安全,但性能相对弱

89.ASP。NET与ASP相比,主要有哪些进步?
  答:asp解释形,aspx编译型,性能提高,可以跟美工的工作分开进行,更有利于团队开发。

90.常用的调用WebService的方法有哪些?
     答:1.使用WSDL.exe命令行工具。
     2.使用VS.NET中的Add Web Reference菜单选项

posted @ 2014-03-31 11:13  fireshadow23  阅读(205)  评论(0编辑  收藏  举报