C#经典面试之概念

1.  请你说说.NET中类和结构的区别?

答:.值类型与引用类型

  结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型

  类是引用类型:引用类型在堆上分配地址

  堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑

  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

  注:

  1).虽然结构与类的类型不一样,可是他们的基类型都是对象(object,c#中所有类型的基类型都是object

  2).虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

  .继承性

  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .

  类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承

  注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样

.内部结构:

  结构:没有默认的构造函数,但是可以添加构造函数  没有析构函数  没abstract sealed(因为不能继承)

  不能有protected 修饰符  可以不使用new 初始化  在结构中初始化实例字段是错误的

  类:有默认的构造函数  有析构函数  可以使用 abstract sealed   有protected 修饰符  必须使用new 初始化

  .如何选择结构还是类

  讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

  1).堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

  2).结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

  3).在表现抽象和多级别的对象层次时,类是最好的选择

  4).大多数情况下该类型只是一些数据时,结构时最佳的选择

结构和类具有大体的语法,但是结构受到的限制比类要多。结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默认的构造函数和析构函数。结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是应用类型,改变其变量的值会改变其原值。申明结构用 Struck关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用。与类不同,结构的实例化可以不使用New关键字。类 可以实现接口。

2.  值类型和引用类型的区别?

答:值类型的值是存放在堆栈中的,改变其值,不改变变量原有的值,而引用类型的值是存放在栈中的,其引用的地址是存放在堆栈中的,改变其值也就改变了变量原有的值。值类型不允许包含null值,然而可空类型可以将null赋值给值类型l

引用类型用处是返回两个以上参数的时候比较好用 ref out 我常用的是out不要先赋值。结构是值类型,类是引用类型,所以传结构就是值类型的应用啦,传对象或类就是引用类型的

3.  死锁的必要条件?怎么克服?

答:产生死锁的原因主要是:系统的资源不足,进程的推进的顺序不合适,资源分配不当。产生死锁的四个必要条件:1)互斥条件:一个资源每次只能被一个进程使用;2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;3) 不剥夺条件:进程获得资源时,未使用完前,不能强行剥夺。4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁

4.  接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?

答:接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,实体类必须要有明确的构造函数

5.  构造器Constructor是否可以被继承?是否可以被Override?

答:Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading)

6.  当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法?

答:不可以,一个对象的方法只能由一个线程访问。

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

. private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。

public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。

8.  override与重载的区别

答 :Override是重写的意思,它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同。

Overload是重载是意思,它也表示重写基类的方法,但是只要方法名相同,别的可以不同

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

答:不是。可以用任意类型。

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

答:一般为3层     数据访问层,业务层,表示层。

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

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

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

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

缺点: 增加成本。

11. 什么是强类型系统?

答:强类型系统是通过运行时类型识别(RTTI(Run-Time Type Identification),程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

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

答:1)、Connection对象:(数据库连接对象)用于连接数据库的对象,表示到数据源的一个唯一的连接。
2
)、Command对象:(数据库命令)表示要对数据库执行的一个SQL语句或一个存储过程。
3
)、DataReader对象:(数据库读取器)它与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据。
4
)、DataAdapter对象:该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等。
5
)、DataSet对象:(数据集)表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表 (DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。

6)、DataTable:这个对象代表着可以在DataSet对象内找到的所有表
7
)、DataColumn:表包含与列有关的信息,包括列的名称、类型和属性。我们可以按照下面的方式创建DataColumn对象,指定数据类型,然后把列加入到表
8
)、DataRow:要填充一个表,我们可以使用命令的自动数据绑定功能,或者也可以手工添加行
9
)、DataRelation:这个对象代表着两个表之间的父-子关系。关系建立在具有同样数据类型的列上

13. DataReaderDataset有什么区别?

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

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

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

remoting接口只能用在.net.net中用来跨越machine, process,appdomain进行方法调用的技术,对于三成结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM Web Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。Web Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型

15. abstract classinterface有什么区别?

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

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

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

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

17. sleep() wait() 有什么区别?

答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。

wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

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

答:final—修饰符(关键字)用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载

finally—是异常处理语句结构中,表示总是执行的部分。如果抛出一个异常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果有的话)。

finalize—方法名。表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

19. 进程和线程的区别?

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

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

20. 堆和栈的区别?

答:栈(Stack):是由是操作系统自动分配和释放的,栈上的空间是有限的。程序在编译期间变量和函数分配内存都是在栈上进行的,且在运行时函数调用时的参数的传递也是在栈上进行的。在函数体中定义的变量通常在栈上。

(Heap):空间是由手动操作分配和释放的,它的存储区很大的自由存储区。一般由程序员分配释放。用newmalloc等分配内存函数分配得到的就是在堆上。

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

答:所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。(例:ASP.NET Web应用有一个登录页面)

如何防止:利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。

1)    对于动态构造SQL查询的场合:第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。第二:删除用户输入内容中的所有连字符,防止攻击者构造出类。第三:对于用来执行查询的数据库帐户,限制其权限。

2)  用存储过程来执行所有的查询。

3)  限制表单或查询字符串输入的长度。

4)  检查用户输入的合法性,确信输入的内容只包含合法的数据。

5)  将用户登录名称、密码等数据加密保存。

6)  检查提取数据的查询所返回的记录数量。

22. 什么是反射?

答:动态获取程序集信息

23. 什么是Application Pool

答:Web应用,类似Thread Pool,提高并发性能。

24. 什么是虚函数?什么是抽象函数?

答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。

25. Static Nested Class Inner Class的不同,说得越多越好

答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化

26. &&&的区别。

答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and.

27. Overloaded的方法是否可以改变返回值的类型?

答:Overloaded的方法是可以改变返回值的类型。

28. errorexception有什么区别?

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

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

29. 重载与覆盖的区别?

答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系

2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。

3、覆盖要求参数列表相同;重载要求参数列表不同。

4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。

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

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

31. HashMapHashtable区别?

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

同点: 都属于Map接口的类,实现了将惟一键映射到特定的值上

不同点:

1: .历史原因: Hashtable是基于陈旧的Dictionary类的,HashMapJava 1.2引进的Map接口的一个实现

2: 同步性: Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的, 所以Hashtable HashMap 慢,因为它是同步的.

3. Hahtable 类似于 HashMap,但是不允许 null 键和 null 值。HashMap 类没有分类或者排序。它允许一个 null 键和多个 null .    只有HashMap可以让你将空值作为一个条目的keyvalue.

32. CollectionCollections的区别?

Collection是集合类的上级接口,Collections是针对集合类的一个帮助类,它提供一系列静态方法来实现对各种集合的搜索,排序,线程安全化操作。

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

答:委托声明的关键字是delegate委托是一种安全的类似与函数指针,但是她比指针要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。事件是一种消息机制,它是一种委托,委托不带方法体。

委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。是,是一种特殊的委托

34. 如何理解委托?

答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.

msdn2005中是这样解释的:委托具有以下特点:

委托类似于 C++ 函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起;例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

35. New有几种用法?

答:有3种,第一种是,实例化如:New Class()

第二种是,public new 隐藏基类的方法

第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。

36. 概述反射和序列化?

答:反射:反射提供了封装程序集,模块和类型对象,可以用反射动态地创建类型的实例,将类型绑定到现有对象,或者从现有对象类型里获取类型,然后调用类型的方法或访问字段和属性。

序列化:将对象转换为另一种媒介传输的格式过程。如,序列化一个对象,用Http通过internet在客户端和服务器之间传递该对象,在另一端用反序列化从该流中重新得到对象。

37. ConstReadOnly?

答:·  constreadonly的值一旦初始化则都不再可以改写;

·  const只能在声明时初始化;readonly既可以在声明时初始化也可以在构造器中初始化;

·  const隐含static,不可以再写static constreadonly则不默认static,如需要可以写static readonly

·  const编译期静态解析的常量(因此其表达式必须在编译时就可以求值);readonly则是运行期动态解析的常量;

·  const既可用来修饰类中的成员,也可修饰函数体内的局部变量;readonly只可以用于修饰类中的成员

38. 什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTSCLSCLR分别作何解释?

答:应用程序域:就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。

托管代码:使用CLR编译语言编辑器开发编写的代码就叫托管代码。

受管制的代码:在.NET环境中运行的任何代码都为受管制的代码.unsafe:非托管代码。不经过CLR运行。

装箱和拆箱:是把值类型转换为引用类型的过程,是装箱,是隐式的,相反的过程就是拆箱,是显式的。

CTS(Common Type System)是公共类型系统,CLS(Common Language Specification)是公共语言规范,CLR(Common Language Runtime)公共语言运行库。

强类型系统:每个变量和对象都必须具有申明类型。

重载  方法名相同 不用个数的参数或者指定不同参数类型

class box{

int aa(object i)

{} 

object bb()

{}

}

 int bb=5

new box().aa(bb)                  //装箱

int conver=intnew box().zz();  //拆箱

//重载

public void aaa(int rad)

{    }

public void aaa(int len,int bre )

{    }

public void aaa(sting str)

{    }

39. CLRIL分别是什么含义?

CLR:公共语言运行时,类似于Java中的JVMJava虚拟机;在.Net环境下,各种编程语言使用一种共同的基础资源环境,这就是CLRCLR将直接与*作系统进行通信,而编程语言如C#.NET将尽量避免直接与*作系统直接通信,加强了程序代码的执行安全性,可以这样看:CLR就是具体的编程语言如:C#.NET*作系统之间的翻译,同时它为具体的编程语言提供了许多资源:

IL,中间语言,也称MSIL,微软中间语言,或CIL,通用中间语言;所有.NET源代码(不管用哪种语言编写)在进行编译时都被编译成IL。在应用程序运行时被即时(Just-In-TimeJIT)编译器处理成为机器码,被解释及执行。

40. 如何理解.net中的垃圾回收机制?

答:.NET中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。

垃圾回收机制是引用程序对内存的回收和释放当每次用new创建一个对象时 都要从堆中为其分配内存因为空间是有限的 最终垃圾回收机制是要回收和释放内存以便重新使用

41. 能用foreach遍历访问的对象需要实现?

答:需要实现IEnumerable接口(公开枚举数,该枚举数支持在集合上进行简单迭代。)GetEnumerator ()方法。(返回对 IEnumerator 接口的引用,该接口用于赋予对枚举项的访问权。)

42. C#中的接口和类有什么异同。

接口,是可以多继承,类只有单继承.接口强调了你必须实现,而没有具体实现的方法和虚类有点相似

接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!

在类中也有抽象类的定义,抽象类与接口的区别在于:

抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。

但接口是一个行为的规范,里面的所有东西都是抽象的!

一个类只可以继承一个基类也就是父类,但可以实现多个接口

43. 活动目录的作用。

特点是不需要事先定义数据库的参数,可以做到动态地增长,性能非常优良。这个数据存储之上已建立索引的,可以方便快速地搜索和定位。活动目录的分区是"域(Domain",一个域可以存储上百万的对象。域之间还有层次关系,可以建立域树和域森林,无限地扩展。

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

system.xml (system.io创建目录的时候用)

45. 私有程序集与共享程序集有什么区别?

一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子目录中。共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类。

46. 请叙述类与结构的区别。

1)、结构是值类型;

  2)、结构不支持继承;

  3)、结构不能定义默认的构造函数;

  4)、结构不能定义析构函数;

5)、结构不能使用初始值设置域值。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值