《程序員級別鑑定書》 ----中級.NET開發者

面向接口、面向對象和麪向方面編程區別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垃圾回收器原理

 

.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程序員問題以及答案。

本文並非真正用來鑑別程序員級別的,我相信你們內心都有本身的標準。

本文部分經典問題,足夠寫一個系列的博文了。可是我水平有限,園內有好的文章連接,我都加上了。

本文轉載自北冥冰皇

相關文章
相關標籤/搜索