面向接口、面向对象和面向方面编程区别html
面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章连接面向接口编程详解(一)——思想基础)程序员
面向接口编程 接口是一组规则集合编程
面向对象编程 对具备相同行为和属性事物的封装 重用性、灵活性、扩展性设计模式
面向方面编程 (AOP面向方面编程)缓存
接口和类的区别函数
关键字 class,interface工具
接口不能被实例化post
接口支持多重继承性能
接口不去实现方法和属性ui
继承接口的类须要实现接口的全部方法
类能够被实例化
继承类的类不须要实现非abstract修饰的全部方法
类能够继承多个接口,但只能继承一个类
反射
反射(Reflection)是.NET中的重要机制,经过反射,能够在运行时得到.NET中每个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。
还能够得到每一个成员的名称、限定符和参数等。
设计模式中
采用反射技术能够简化工厂的实现
1.工厂方法:经过反射能够将须要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。
2.抽象工厂:使用反射能够减小抽象工厂的子类。
采用反射技术能够极大简化对象的生成
1.命令模式:能够采用命令的类型名称做为参数直接得到命令的实例,而且能够动态执行命令。
2.享元模式:采用反射技术实例化享元能够简化享元工厂。
反射演示代码,以下:
static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> //[STAThread] static void Main() { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); System.Console.WriteLine("列出程序集中的全部类型"); //System.Reflection.Assembly 表示一个程序集,它是一个可重用、无版本冲突而且可自我描述的公共语言运行时应用程序构造块 Assembly a = Assembly.LoadFrom("Reflection.exe"); //类型声明 Type[] mytypes = a.GetTypes(); foreach (Type t in mytypes) { System.Console.WriteLine(t.Name); } System.Console.ReadLine(); System.Console.WriteLine("列出HellWord中的全部方法"); Type ht = typeof(HelloWorld); // System.Reflection.MethodInfo 发现方法的属性并提供对方法元数据的访问 MethodInfo[] mif = ht.GetMethods(); foreach (MethodInfo mf in mif) { System.Console.WriteLine(mf.Name); } System.Console.ReadLine(); System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法"); //实例化HelloWorld Object obj = Activator.CreateInstance(ht); string[] s = { "zhenlei" }; //实例化HelloWorld Object objName = Activator.CreateInstance(ht, s); // System.Reflection.BindingFlags //指定控制绑定和由反射执行的成员和类型搜索方法的标志。 //此枚举有一个 FlagsAttribute 特性,经过该特性可以使其成员值按位组合。 BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); MethodInfo msayhello = ht.GetMethod("SayHello"); msayhello.Invoke(obj, null); msayhello.Invoke(objName, null); System.Console.ReadLine(); System.Console.Read(); } } /// <summary> /// HelloWorld类 /// </summary> public class HelloWorld { string myName = null; /// <summary> /// 构造函数 /// </summary> /// <param name="name"></param> public HelloWorld(string name) { myName = name; } /// <summary> /// 构造函数 /// </summary> public HelloWorld() : this(null) { } /// <summary> /// 属性 /// </summary> public string Name { get { return myName; } } /// <summary> /// 方法 /// </summary> public void SayHello() { if (myName == null) { System.Console.WriteLine("Hello World"); } else { System.Console.WriteLine("Hello," + myName); } } }
XML Web Service跟.NET Remoting的不一样
Web 服务使用的消息机制,而Remoting采用的RPC。
Web Service能用于不一样平台,不一样语言,Remoting只适用于.NET。
效率上Remoting高于XML Web Service。( .NET Remoting和WebService)
early-binding 和late-binding 的区别
early-binding 编译时绑定
late-binding 运行时绑定
Assembly.Load是静态引用仍是动态引用
动态
Assembly.LoadFrom和Assembly.LoadFile,2者使用的时机有何不一样
Assembly.LoadFrom会载入DLL文件及其引用的其余DLL
Assembly.LoadFile只载入相应的DLL文件
什么是Assembly Qualified Name
Assembly Qualified Name(程序集限定名称),相比文件名更能肯定一个程序集,它包含文件名,但同时包含版本,公钥和区域。
Assembly.Load("foo.dll")加载程序集的方法是否正确
不正确。应为:Assembly.Load("foo, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3")
强签名的程序集与非强签名的程序集有何不一样
强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(若是提供的话)。
强名称的做用主要有三个:
区分不一样的程序集;
确保代码没有篡改过;
在.NET中,只有强名称签名的程序集才能放到全局程序集缓存中 (强名称(1)使用强名称保护代码完整性)
DateTime 能够为null吗
DateTime不能为null。DateTime属于值类型,值类型不能为null。只有引用类型才能被赋值null。
什么是 JIT、什么是 NGEN、分别的优点和劣势是什么?
JIT(Just In Time)这是咱们经过.NET编译器生成的应用程序最终面向机器的编译器
本机映像生成器(Ngen)是一种提升托管应用程序性能的工具。
Ngen.exe建立本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。
运行时可从缓存中使用本机映像,而没必要使用实时(JIT)编译器编译原始程序集。
因为JIT编译器会在调用程序集中定义的单个方法时将该程序集的MSIL转换为本机代码,于是一定会对运行时的性能形成影响。
在大多数状况下,这种性能影响是能够接受的。更为重要的是,由JIT编译器生成的代码会绑定到触发编译的进程上。它没法在多个进程之间进行共享。
为了能在多个应用程序调用或共享一组程序集的多个进程之间共享生成的代码,公共语言运行库支持一种提早编译模式。
此提早编译模式使用本机映像生成器(Ngen.exe)将MSIL程序集转换为本机代码,其做用与JIT编译器极为类似。
Ngen.exe的操做与JIT编译器操做有三点不一样:
它在应用程序运行以前而不是运行过程当中执行从MSIL到本机代码的转换
它一次编译一个完整的程序集,而不是一次编译一个方法
它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上
如何在.NET CLR的分代垃圾收集器管理对象的生命周期?什么是不肯定性的终结?
.NET的垃圾回收分为3代,可经过GC.Collect强制处理
Finalize()和Dispose()的区别
Finalize只释放非托管资源
Dispose释放托管和非托管资源
Finalize和Dispose共享相同的资源释放策略,所以他们之间也是没有冲突的。
Using()模式有用吗? IDisposable是什么? 它如何支持肯定性的终结?
using()限定资源做用域并自动释放
IDisposable是一个接口,有一个方法Dispose(),能够在对象出做用域的时候调用,如在using出界后调用这个接口。
tasklist /m "mscor*" 命令行的做用
列出全部使用符合引号内 名称 的DLL的进程和模块。
in-proc 和 out-of-proc 之间的区别是什么
In-proc 在一个进程内,进程内能共享代码和数据块,out-of-proc 是进程外,进程外的互操做须要用进程间通信来实现。
out-of-proc是基于什么技术实现的
.Net Remoting技术或者WCF技术
当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪一个进程里面
XP:aspnet_wb.exe
2000:inetinfo.exe
2003:w3wp.exe
注:感谢下面网友的评论~~~~
本文只是整理了网上流传的《程序员级别鉴定书》中的中级.NET程序员问题以及答案。
本文并非真正用来鉴别程序员级别的,我相信你们内心都有本身的标准。
本文部分经典问题,足够写一个系列的博文了。可是我水平有限,园内有好的文章连接,我都加上了。
本文转载自北冥冰皇