c#常用的区别总结
抽象类和接口的区别 |
|
抽象类 |
使用abstract关键字(abstract class) 可以包含功能定义和实现 反映的是事物的内部共性 不能被实例化 例:Public abstract class Withdraw |
接口 |
使用interface关键字 只能包含功能定义 因此反映的是事物的外部特性 不能被实例化 例:Public interface Withdraw |
结构和类的区别 |
|
结构 |
是值类型,保存在栈上 对结构中的数据进行操作比对类或对象中的数据进行操作速度要快 一般用结构存储多种类型的数据 当创建一个很多类或对象共用的小型对象时,使用结构效率更高 |
类 |
引用类型,保存在受管制的堆上 |
抽象方法和虚方法的区别 |
|
抽象方法 |
使用abstract关键字 必须被派生类覆写的方法 可以看成没有实现体的虚方法,是虚方法的一种 例:Public abstract bool Withdraw(…); |
虚方法 |
使用virtual关键字 虚方法可以有实现体 可以在子类中覆盖,也可以不覆盖使用父类的默认实现 例:public virtual bool Withdraw(…); |
值类型和引用类型的区别 |
|
值类型 |
值类型的变量直接存放实际的数据 把变量的值保存在堆栈中 |
引用类型 |
引用类型的变量存放的则是数据的地址,即对象的引用 把实际数据的地址保存在堆栈中,而实际数据则保存在堆中 |
堆和堆栈的区别 |
|
堆 |
堆一般用于存储可变长度的数据,如字符串类型 |
堆栈 |
用于存储固定长度的数据,如整型类型的数据 |
Const和readonly的区别 |
|
Const |
只能在该字段声明中初始化 const 字段是编译时常数 const 默认就是静态的 const 对于引用类型的常数,可能的值只能是 string、值类型和 null |
Readonly |
可以在声明或构造函数中初始化 根据所使用的构造函数,readonly 字段可能具有不同的值 readonly 字段可用于运行时常数 readonly 如果设置成静态的就必须显示声明 readonly可以是任何类型 对于一个 readonly 的 Reference 类型,只是被限定不能进行赋值(写)操作而已。而对其成员的读写仍然是不受限制的 |
面向过程和面向对象的区别 |
|
面向过程 |
是一种谓语和宾语的关系 |
面向对象 |
是一种主语和谓语的关系。特征:封装、继承、多态 |
类和对象的区别 |
|
类 |
类是对某一类事物的描述,是抽象的、概念上的 定义。 *面向对象的设计的重点是类的设计。 |
对象 |
对象又称作实例,是实际存在的该类事物的每个个体。 |
==和equeals()的区别 |
|
== |
辨别实质是否相等 |
equeals() |
辨别长相是否相等 |
override和overload的区别 |
|
override |
表示重写,用于继承类对基类中虚成员的实现 |
overload |
表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现 |
private、protected、public、internal 修饰符的访问权限的区别 |
|
private |
私有成员, 在类的内部才可以访问 |
protected |
保护成员,该类内部和继承类中可以访问 |
public |
公共成员,完全公开,没有访问限制 |
internal |
在同一命名空间内可以访问 |
DataReader和DataSet的异同 |
|
DataReader |
始终占用数据连接 在线操作数据库任何对SqlConnection 的操作都会引发DataReader的异常,因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为 DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了 |
DataSet |
则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接,因为DataSet将数据全部加载在内存中.所以比较消耗内存,但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作 |
Appplication.Exit 和Form.Close的区别 |
|
Appplication.Exit |
退出整个引用程序 |
Form.Close |
关闭指定的Form |
Params、ref、out之间的区别 |
|
Params |
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 |
Ref |
需要显式初始化传递到 ref 参数的参数必须最先初始化。。 属性不是变量,不能作为 ref 参数传递 |
Out |
不必初始化作为out参数传递变量,必须在方法返回之前为 out 参数赋值属性不是变量,不能作为 out 参数传递 |
Finalize()和Dispose()之间的区别 |
|
Finalize() |
用于隐式释放资源,相当于C++中的析构函数 |
Dispose() |
用于显示释放资源 |
做强签名的assembly与不做强签名的assembly有什么不同 |
|
强签名的程序集 |
可以做成com 可以安装到gac中 |
不做强签名的程序集 |
不能做出com,不能安装到gac中 |
Assembly.LoadFrom()、Assembly.LoadFile()的区别 |
|
Assembly.LoadFrom() |
它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的 |
Assembly.LoadFile() |
由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行,如果有相同实现,但位置不同的文件用LoadFile是可以同时加载进来的 |
前期绑定(early-binding)和后期绑定(late-binding)的区别 |
|
前期绑定 |
前期绑定是在编译的时候就确定了要绑定的数据,前期绑定如果失败,会在编译时报编译错误 |
后期绑定 |
而后期绑定是在运行的时候才填充数据,后期绑定失败只有在运行时的时候才发生 |
使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别 |
|
Web服务 |
Web服务使用的消息机制. Web Service能用于不同平台,不同语言。 |
Remoting |
Remoting采用的RPC,Remoting只适用于.Net。效率上Remoting高于Xml Web Service |
面向接口、面向对象、面向方面编程的区别 |
|
面向接口 |
面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是依赖倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。 |
面向对象 |
面向对象是对复杂问题的分解 |
面向方面 |
面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。 |
线程与进程的区别 |
|
线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据空间。用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产 |
|
强类型和弱类型的区别 |
|
强类型 |
在编译的时候就确定类型的数据,在执行时类型不能更改,强类型安全,效率高,一般用于编译型编程语言,如c++,java,c#,pascal等 |
弱类型 |
而弱类型在执行的时候才会确定类型,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb等 |
Remoting的信道Tcp和Http的区别 |
|
Tcp |
Tcp信道提供了基于Socket的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流.TcpChannel使用二进制格式序列化消息对象,因此它具有更高的传输性能。 |
Http |
HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性. |