面向接口、面向对象和面向方面编程区别

面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章链接面向接口编程详解(一)——思想基础

面向接口编程 接口是一组规则集合

面向对象编程 对具有相同行为和属性事物的封装 重用性、灵活性、扩展性

面向方面编程 (AOP面向方面编程

接口和类的区别

关键字 class,interface

接口不能被实例化

接口支持多重继承

接口不去实现方法和属性

继承接口的类需要实现接口的所有方法

类可以被实例化

继承类的类不需要实现非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程序员问题以及答案。

本文并不是真正用来鉴别程序员级别的,我相信大家心里都有自己的标准。

本文部分经典问题,足够写一个系列的博文了。但是我水平有限,园内有好的文章链接,我都加上了。

本文转载自北冥冰皇

《程序员级别鉴定书》 ----中级.NET开发者的更多相关文章

  1. 程序员级别鉴定书(.NET面试问答集锦)

    作为一个.NET程序员,应该知道的不仅仅是拖拽一个控件到设计时窗口中.就像一个赛车手,一定要了解他的爱车 – 能做什么不能做什么. 本文参考Scott Hanselman给出的.NET问题列表,整理如 ...

  2. (转)程序员级别鉴定书(.NET面试问答集锦)

    原文地址:http://www.cnblogs.com/powertoolsteam/p/what-net-developer-should-to-know.html 葡萄城控件 作为一个.NET程序 ...

  3. java程序员级别划分

    IT路虽好,却难走.1级   为会基本语法 大学里的JAVA教程 能及格 2级   自己可以写个 俄罗斯方块,扫雷,贪吃蛇, 拼图之类的小游戏 3级   能够进手机游戏CP,SP公司,做手机游戏 或者 ...

  4. 身边好几个技术一般的程序员都面上了,阿里P7门槛降低?

    经常在网上的论坛里看到讨论程序员的级别,尤其在跳槽类的信息里可以看到对标阿里P7,百度T6,腾讯3.1等字眼,似乎大厂的级别俨然可以成为业内的通用货币,类似于高考分数一样,哪一档就对应着什么样的待遇. ...

  5. Android程序员的进阶之路

    本文主要论述的是Android程序员的进阶之路,博主本人就是一名android开发攻城狮,所以这里讲述的大多数是android开发攻城狮的技术进阶之路,如有问题请多指正. 大家都知道程序员之中有有菜鸟 ...

  6. 程序员最爱 Mac、JS 是最热门技术

    概况: 今年,有超过5万名开发者向我们分享了他们是谁,做什么工作,以及他们的成果.通过本文,你将看到有史以来最为全面的一次开发者情况调查的结果. 每8秒钟,就会有一位开发者在Stack Overflo ...

  7. IT观察】网络通信、图片显示、数据库操作……Android程序员如何利用开源框架

    每个Android 程序员都不是Android应用开发之路上孤军奋战的一个人,GitHub上浩如烟海的开源框架或类库就是前人为我们发明的轮子,有的轮子能提高软件性能,而有的轮子似乎是以牺牲性能为代价换 ...

  8. Android群英传神兵利器读书笔记——第一章:程序员小窝——搭建高效的开发环境

    1.1 搭建高效的开发环境之操作系统 1.2 搭建开发环境之高效配置 基本环境配置 基本开发工具 1.3 搭建程序员的博客平台 开发者为什么要写作 写作平台 第三方博客平台 自建博客平台 开发论坛 1 ...

  9. Java 进阶 hello world! - 中级程序员之路

    Java 进阶 hello world! - 中级程序员之路 Java是一种跨平台的语言,号称:"一次编写,到处运行",在世界编程语言排行榜中稳居第二名(TIOBE index). ...

随机推荐

  1. Android自动化测试之MonkeyRunner录制和回放脚本

    Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 andro ...

  2. VB.NET与 sql数据库

    数据蕴含丰富的信息,数据就是资源. 不同的语言,因为各自的语法特点.对sql数据库的连接操作有些小差别.但有一点,那就是.对sql数据库的操作语句sql语句大体是一样的. 这段时间正进行VB.NET的 ...

  3. String、StringBuilder、StringBuffer对比

    参考:http://swiftlet.net/archives/1694 http://www.cnblogs.com/springcsc/archive/2009/12/03/1616326.htm ...

  4. canvas学习笔记(中篇) -- canvas入门教程-- 颜色/透明度/渐变色/线宽/线条样式/虚线/文本/阴影/图片/像素处理

    [中篇] -- 建议学习时间4小时  课程共(上中下)三篇 此笔记是我初次接触canvas的时候的学习笔记,这次特意整理为博客供大家入门学习,几乎涵盖了canvas所有的基础知识,并且有众多练习案例, ...

  5. python导入模块的两种方式

    第一种 from support import * 这种方式导入后可以直接调用(有命名冲突问题)命名冲突后定义的覆盖前定义的 如果在函数导入前定义 则导入函数覆盖 否则相反 if __name__ = ...

  6. android http post 请求与 json字符串

    一.目标 android客户端发送一个json格式的http的请求,期望得到服务端的一个json反馈. 1. 客户端发送的json格式为: {"data" : "valu ...

  7. WebKit(Blink分支)各组件的创建与逻辑关系

    从render_view_impl.cc開始说起. 1.     方法RenderViewImpl::Initialize中有: WebLocalFrame* web_frame = WebLocal ...

  8. 查询清除SQL Server数据库备份还原历史记录

    曾经遇到过一个用户MSDB数据库非常大,让我帮忙查查是什么原因.使用sp_spaceused找出了所有表的数据大小,发现问题是SQL Server备份和还原历史表数据太大.用户经常会做日志备份,但是从 ...

  9. linux下的几个cd命令

    linux cd命令 cd data 进入到 data 目录 cd .. 返回上级文件夹 cd ~ 返回用户主文件夹 cd / 返回根文件夹

  10. FPGA的图像处理技术

    最近一段时间一直在研究基于FPGA的图像处理,乘着EEPW这个机会和大家交流一下,自己也顺便总结一下.主要是为了大家对用FPGA做图像处理有个感性的认识,如果真要研究的话就得更加深入学习了.本人水平有 ...