《程序员级别鉴定书》 ----中级.NET开发者

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

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

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

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

面向方面编程 (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开发者,布布扣,bubuko.com

时间: 2024-10-26 08:28:48

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

程序员级别鉴定书 ----中级.NET开发者

面向接口.面向对象和面向方面编程区别 面向接口编程 是面向对象编程体系中的思想精髓之一 (博客园文章链接面向接口编程详解(一)——思想基础) 面向接口编程 接口是一组规则集合 面向对象编程 对具有相同行为和属性事物的封装 重用性.灵活性.扩展性 面向方面编程 (AOP面向方面编程) 接口和类的区别 关键字 class,interface 接口不能被实例化 接口支持多重继承 接口不去实现方法和属性 继承接口的类需要实现接口的所有方法 类可以被实例化 继承类的类不需要实现非abstract修饰的所有

程序员级别鉴定书 ----会写代码级别

线程跟进程 一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高. 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率. 线程在执行过程中跟进程有区别 线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制 进程具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.

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

作为一个.NET程序员,应该知道的不仅仅是拖拽一个控件到设计时窗口中.就像一个赛车手,一定要了解他的爱车 – 能做什么不能做什么. 本文参考Scott Hanselman给出的.NET问题列表,整理如下.包括WinForms,ASP.NET,XML以及C#和.NET基础相关的问题,有兴趣的自我检测一下吧- 参考答案另附在文章末尾,由于水平有限,难免有谬误,欢迎指正. 所有号称会写代码的人 进程和线程之间的区别? 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同? Windows

西安尚学堂 程序员初级、中级和高级的区别在哪里

前言 低级程序员认为自己与高级程序员的区别, 主要是高级程序员任何功能都能编码实现, 编码速度快, 代码无bug.高级程序员认为他们之所以高级, 在于他们认识到代码 bug 是不可避免的, 有千万种理由可以导致 bug,但他们可以在设计和逻辑上保证(追求)滴水不漏,并用逻辑的百分之百准确性还减少代码 bug.同样是程序员,初级.中级与高级的区别究竟在哪里呢? 初级程序员 初级程序员就是传说中的码农,依靠复制粘贴.比葫芦画瓢的方式完成代码的编写,通常一个方法几百行代码,恨不得一个类将所有的功能都实

程序员菜鸟必备——作为独立开发者如何系统的学习编程

接触一个行业,前期最好来一个系统的学习,有完整的框架一点一点的把基础吃透,不能左一耙子,右一锄头,以我的从业经验给大家分享如何系统的学习编程开发,刚入坑的程序员菜鸟注意了,迅速占领高地,迅速收藏了. 总体大致分为以下几类: A.教材上的知识 这部分内容来自计算机专业的课程教材.也有可能会涉及一部分来自其他相关专业或者相关课程的内容. B.编程语言 每一个程序员只有在会使用一门语言的情况下才有可能从事开发工作,所以学习并掌握一门语言是最低要求了. C.SDK 光有一门语言是不够的,从事任何实际的软

程序员级别,你到哪一级?

程序员的成长不是看工作年限的,而是看业务能力.这种能力不光是写码,我觉得大致可以分这么几级: 第一级,能把需求做出来: 第二级,能把需求做得快: 第三级,能把需求做得稳(少bug): 第四级,能和产品经理一起控制有潜在问题的需求,并对常用场景提供标准化解决方案: 第五级,能把自己的能力批量复制给同事和下属: 第六级,能在战略层理解技术对公司业务的作用,不断的通过技术改进和技术创新推动公司业务发展. 你到哪一级了? <程序员必读的职业规划书>作者 职鹿

java程序员级别划分

IT路虽好,却难走.1级   为会基本语法 大学里的JAVA教程 能及格 2级   自己可以写个 俄罗斯方块,扫雷,贪吃蛇, 拼图之类的小游戏 3级   能够进手机游戏CP,SP公司,做手机游戏 或者应用软件,这个时候也许是给你一个小游戏 或者小软件单独做,或者跟别人做一个项目中的一个小模块,(1W行左右代码量) 4级   能单独做一个项目或者在复杂项目中负责较多模块,(1W行左右代码量) 5级   能在较负责项目中负责主要模块或者较多模块,(1-5W行左右代码量) 6级   项目LEADER,

程序员的十种级别,看看你属于哪一种?

第一级:神人,天资过人而又是技术狂热者同时还拥有过人的商业头脑,高瞻远瞩,技术过人,大器也. 第二级:高人,有天赋,技术过人但没有过人的商业头脑,通常此类人不是顶尖黑客就是技术总监之流. 第三级:牛人,技术精湛,熟悉行业知识,敢于创新,有自己的公司和软件产品. 第四级:工头,技术精湛,有领导团队的能力,此类人大公司项目经理居多. 第五级:技术工人,技术精湛,熟悉行业知识但领导能力欠加,此类人大多为系分人员或资深程序员,基本上桀骜不逊,自视清高,不愿于一般技术人员为伍,在论坛上基本以高手面目出现.

每一个程序员都必须阅读的10篇文章

原文:10 Atricle Every Programmer Must Read by Javin Paul 作为一名Java程序员和软件开发者,我已经从那些名为<关于XXX,每个程序员都应了解的>的文章中学了很多东西,这些文章倾向于提供许多关于某一个特定主题的实用的.有深度.难以发掘的信息.在我的学习过程中,我读到了不少非常有用的文章,我会收藏这些文章以便日后参考和再次阅读.我个人认为所有程序员可以从这些文章中获益,这也是促使我发帖,并与你们分享这些<关于XXX,每个程序员都应了解的&