面向接口、面向对象和面向方面编程区别
面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章链接面向接口编程详解(一)——思想基础)
面向接口编程 接口是一组规则集合
面向对象编程 对具有相同行为和属性事物的封装 重用性、灵活性、扩展性
面向方面编程 (AOP面向方面编程)
接口和类的区别
接口不能被实例化
接口支持多重继承
接口不去实现方法和属性
继承接口的类需要实现接口的所有方法
类可以被实例化
继承类的类不需要实现非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垃圾回收器原理
.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程序员问题以及答案。
本文并不是真正用来鉴别程序员级别的,我相信大家心里都有自己的标准。
本文部分经典问题,足够写一个系列的博文了。但是我水平有限,园内有好的文章链接,我都加上了。