整理一下,权当收藏

任何一个使用.NET的人 javascript

  • 描述线程与进程的区别? 

进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程以内独立执行的一个单元。对于操做系统而言,其调度单元是线程。一个进程至少包括一个线程,一般将该线程称为主线程。java

  • 什么是Windows服务,它的生命周期与标准的EXE程序有什么不一样 

Windows服务只是运行于后台的一种进程而已,而且它们的绝大部分并不要求用户交互。由三部分组成:1.一个服务可执行文件;2.一个服务控制程序(SCP);3.服务控制管理器(SCM),负责在 HKLM"SYSTEM"CurrentControlSet"Services 下建立服务键值。用户可经过 SCP 控制服务的启动、中止、暂停等,SCP 会经过 SCM 调用服务程序。程序员

  • Windows上的单个进程所能访问的最大内存量是多少?它与系统的最大虚拟内存同样吗?这对于系统设计有什么影响? 

32位单个进程所能访问的最大内存量是4G.虚拟内存是用硬盘空间作内存来弥补计算机RAM空间的缺少。当实际RAM满时(实际上,在RAM满以前),系统就会使用虚拟内存,应用把虚拟内存和实际内存看做是同样的。二者不是一个层次的东西。算法

在设计时候应注意到这里的内存空间是指代码空间和数据空间的集合。代码等资源也是占空间的。spring

  • EXE和DLL之间的区别是什么? 

Windows系统中,EXE 和 DLL都是可执行文件(没错,DLL也是可执行文件),EXE一般是能够直接运行的可执行文件,包含数据和代码;而 DLL是动态连接库文件,同时也有多是纯资源文件,只包含数据,不含程序代码。更多的时候DLL是一个函数的集合,其目的之一就是能被更多的应用程序所复用。EXE 和DLL的区别就是DLL能提供函数级的复用,而EXE比较困难。编程

  • 什么是强类型,什么是弱类型?哪一种更好些?为何? 

强类型语言有JAVA、C#等。强类型语言在一块内存定义的某种类型后是没法改变其类型的。好比string s;那么s不能再看成int来使用了,除非进行类型转换。缓存

弱类型语言有javascript、PHP等。弱类型语言能够把一块内存定义为多种类型的。好比安全

var s="";服务器

s=5;多线程

var a=s+3;//a=8

s在定义了string类后还能再看成int来使用。

没有好坏之分,但整体来讲强类型语言容易维护和容易理解。

  • PID是什么?在作系统的故障排除时如何使用它? 

PID (Process Identifier), 是一个全局惟一的用来标识进程的整数。在多任务系统中,可用来诊断系统中发生错误的进程。

  • 单个TCP/IP端口上可以侦听多少个进程? 

一个进程启动一个TCP/IP端口去抓取到进来的包,若是有另一个进程想利用这个端口将提示“端口已经被占用”。

  • 什么是GAC?它解决了什么问题? 

GAC全称是Global   Assembly   Cache,简单的讲他是一个能够存放一些有不少程序都要用到的公共Assembly,或者你能够理解为共享文件夹。

好比System.Windows.Forms.DLL就是放在GAC中,否则每一个程序都得拷贝一份System.Windows.Forms.DLL在执行目录下。 

GAC的具体目录在C:\WINDOWS\Assembly\  

 

中级.NET开发人员 

  • 阐述面向接口、面向对象、面向方面编程的区别 

面向对象编程:经过封装、继承、多态等更加有效的组织程序。

面向接口编程:经过接口规约对象的属性和方法,是面向对象一部分。

面向方面编程:把业务的主逻辑和次逻辑分开的一种思想

 

面向对象很差解释,能够理解为以一切元素都是对象,在设计时以对象为单位,考虑它的属性及方法。设计中采用了封装、继承、抽象的手法

面向接口自己就是面向对象的,无所谓区别,只不过面向接口的好处是耦合性低

面向方面Aspect-Oriented Programming (AOP)就是大名鼎鼎的AOP。其实有点象struts里的拦截。

举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个数据封装在数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。
为了完成上述并发访问同一资源的功能,须要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就当即解锁unLocked,再供其它访问类访问。

  • 什么是Interface?它与Class有什么区别? 

接口能够理解成一种特殊的类,由常量和抽象方法组成的特殊类。

接口不能实例化; 

接口中的方法没有方法体{}; 

继承接口的类必定要实现接口中定义的方法; 

类能够实例化,能够定义本身的字段,属性,方法等等; 

类能够继承多个接口,但只能继承一个类!

  • 什么是反射? 

提供了一种使用类名和方法名来访问方法的机制。

  • 使用ASMX的XML Web服务与使用SOAP的.NET Remoting的区别? 

SOAP是简单对象访问协议,Web服务正是经过WSDL来约定服务器和客户端基于xml的SOAP来通信,而不管客户端和服务器不须要知道对方的平台、编程语言等信息。

.NET Remoting本质是为了交互更为复杂的对象,甚至须要管理远程对象的生命周期,因此客户端必须了解服务器对象的详细信息,虽然.NET Remoting支持使用SOAP,但对于客户端来讲仍是必须了解服务器对象的详细信息。

  • 类型系统是由XMLSchema表示的吗?CLS是XMLSchema表示的吗? 

Are the type system represented by XmlSchema and the CLS isomorphic?

我以为问题是这样的,XMLSchema和CLS的类型系统类似吗?

XmlSchema是一个特定的XML文档必须知足的一套标准。这些标准可以描述不一样的数据类型。好比:xs:Boolean

CLS无论值类型仍是引用类型都是一套类型系统,好比System.Boolean.

像不像?你说呢?

  • 从概念上阐述前期绑定(early-binding)和后期绑定(late-binding)的区别? 

若是方法在编译时就肯定就是前期绑定,若是在运行时才肯定的叫后期绑定。

举个例子,好比spring在运行时才取类和类的对象,就是后期绑定

  • 调用Assembly.Load算静态引用仍是动态引用? 

我的理解其实应该是一个反射,System.Reflection.Assembly.Load.因此嘛确定动态引用了。由于静态引用在编译时就已经引用,并使用。

  • 什么时候使用Assembly.LoadFrom?什么时候使用Assembly.LoadFile? 

(声明如下是抄的,我不太了解Assembly.LoadFrom)。区别以下:

一、Assembly.LoadFile只载入相应的dll文件,好比Assembly.LoadFile("a.dll"),则载入a.dll,假如a.dll中引用了b.dll的话,b.dll并不会被载入。

Assembly.LoadFrom则不同,它会载入dll文件及其引用的其余dll,好比上面的例子,b.dll也会被载入。

二、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,好比a.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\a.dll")载入版本2时,不能载入,而是返回版本1。

Assembly.LoadFile的话则不会作这样的检查,好比上面的例子换成Assembly.LoadFile的话,则能正确载入版本2。

  • 什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不一样? 

它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能肯定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。

  • Assembly.Load("foo.dll"); 这句话是否正确? 

Assembly name 有四个部分组成:Friendly Name,Culture, Pubilc Key(Token), Version。因此按他的意思这句话是错误的。

  • 作强签名的assembly与不作强签名的assembly有什么不一样? 

强签名的程序集能够确认assembly name是惟一的(由于使用了public key token)。

强签名的程序集能够作成com。

强签名程序集能够安装到GAC中。

  • DateTime是否能够为null? 

 

不能为null,包括int什么的都不能等于null

 

  • 什么叫JIT?什么是NGEN?它们分别有什么限制和好处? 

.Net程序在第一次运行时会实时(JIT)编译,将.Net程序文件编译成cpu认识的汇编机器码。实时编译须要消耗额外的cpu和内存资源,这对于服务器端程序是可有可无的,由于实时编译只在程序第一次运行时编译,以后就不须要再作了;若是你在作的是一个较大的winform程序或者silverlight等客户端程序时就须要考虑提早编译了。

.Net framework安装目录下(相似C:\Windows\Microsoft.NET\Framework\v4.0.30319)有一个ngen.exe工具,就是作这件事儿的。

JIT即即时编译 .NET 采用中间语言(IL)机制。Just In Time是指程序第一次运行的时候才进行把中间语言(IL)编译成机器代码,JIT增长了执行效率。本机映像生成器 (Ngen.exe) 是一个提升托管应用程序性能的工具。Ngen.exe 建立本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行库可从缓存中使用本机映像,而不是使用实时 (JIT) 编译器编译原始程序集。这是为何asp.net程序第一次会比较慢,由于他是JIT。

  • .NET CLR中一代的垃圾收集器是如何管理对象的生命周期的?什么叫非肯定性终结? 

垃圾收集器不能管理对象的生命周期吧??我认为他只能跟踪对象的生命周期

先看一个对象的生命周期

1.  调用IL的newobj指令,分配必定空间的内存。

2.  初始化内存空间,好比设置为string类型。

3.  使用对象。

4.  销毁对象,执行清理

5.  回收内存

垃圾收集是在第4步。有三种方法:Finalize、Dispose、Close。

但垃圾收集执行的时机不定

的,初学者能够认为对象销毁的时机是在垃圾收集器认为对象须要被销毁的时候进行的,

他对于程序员是透明的,初学者根本不须要知道垃圾收集器的存在。

我的理解的垃圾收集器的执行原理:

周期性地遍历被应用当前引用的全部对象的列表。

在这个搜索过程当中,凡是没有发现的对象,都将准备予以销毁(但不并非立刻就销毁,只是先标记)。

这种算法表示若是对象的最后一个引用也被解除时(意思是该对象不再使用了,便可以销毁了),这时垃圾收集器并

 不会当即接到通知,只有下一次对堆(heap)进行清扫时,才能发现这个状况。 说明了对象

在何时终结是不肯定的,我认为这就是非肯定性终结。进一步而言,执行垃圾收集清扫

 次数越少,这类算法工做得越好。一般来讲,堆的耗满是收集清扫的触发条件。

  • Finalize()和Dispose()之间的区别? 

Finalize自动释放资源,Dispose()用于手动释放资源。

一. Finalize

Finalize很像C++的析构函数,咱们在代码中的实现形式为这与C++的析构函数在形式上彻底同样,但它的调用过程却大不相同。

~ClassName() {//释放你的非托管资源}

好比类A中实现了Finalize函数,在A的一个对象a被建立时(准确的说应该是构造函数被调用以前),它的指针被插入到一个finalization链表中;在GC运行时,它将查找finalization链表中的对象指针,若是此时a已是垃圾对象的话,它会被移入一个freachable队列中,最后GC会调用一个高优先级线程,这个线程专门负责遍历freachable队列并调用队列中全部对象的Finalize方法,至此,对象a中的非托管资源才获得了释放(固然前提是你正确实现了它的Finalize方法),而a所占用的内存资源则必需等到下一次GC才能获得释放,因此一个实现了Finalize方法的对象必需等两次GC才能被彻底释放。

因为Finalize是由GC负责调用,因此能够说是一种自动的释放方式。可是这里面要注意两个问题:第一,因为没法肯定GC什么时候会运做,所以可能很长的一段时间里对象的资源都没有获得释放,这对于一些关键资源而言是很是要命的。第二,因为负责调用Finalize的线程并不保证各个对象的Finalize的调用顺序,这可能会带来微妙的依赖性问题。若是你在对象a的Finalize中引用了对象b,而a和b二者都实现了Finalize,那么若是b的Finalize先被调用的话,随后在调用a的Finalize时就会出现问题,由于它引用了一个已经被释放的资源。所以,在Finalize方法中应该尽可能避免引用其余实现了Finalize方法的对象。

可见,这种“自动”释放资源的方法并不能知足咱们的须要,由于咱们不能显示的调用它(只能由GC调用),并且会产生依赖型问题。咱们须要更准确的控制资源的释放。

二. Dispose

Dispose是提供给咱们显示调用的方法。因为对Dispose的实现很容易出现问题,因此在一些书籍上(如《Effective C#》和《Applied Microsoft.Net Framework Programming》)给出了一个特定的实现模式:

class DisposePattern :IDisposable

    {

        private System.IO.FileStream fs = new System.IO.FileStream("test.txt", System.IO.FileMode.Create);

        ~DisposePattern()

        {

            Dispose(false);

        }       

        IDisposable Members#region IDisposable Members

        public void Dispose()

        {

            //告诉GC不须要再调用Finalize方法,

            //由于资源已经被显示清理

            GC.SuppressFinalize(this);

            Dispose(true);

        }

        #endregion

                protected virtual void Dispose(bool disposing)

        {

            //因为Dispose方法可能被多线程调用,

            //因此加锁以确保线程安全

            lock (this)

            {

                if (disposing)

                {

                    //说明对象的Finalize方法并无被执行,

                    //在这里能够安全的引用其余实现了Finalize方法的对象

                }

                if (fs != null)

                {

                    fs.Dispose();

                    fs = null; //标识资源已经清理,避免屡次释放

                }

            }

        }

    }

 

在注释中已经有了比较清楚的描述,另外还有一点须要说明:若是DisposePattern类是派生自基类B,而B是一个实现了Dispose的类,那么DisposePattern中只须要override基类B的带参的Dispose方法便可,而不须要重写无参的Dispose和Finalize方法,此时Dispose的实现为:

class DerivedClass : DisposePattern

    {

        protected override void Dispose(bool disposing)

        {

            lock (this)

            {

                try

                {

                    //清理本身的非托管资源,

                    //实现模式与DisposePattern相同

                }

                finally

                {

                    base.Dispose(disposing);

                }

            }

        }

    }

 

固然,若是DerivedClass自己没有什么资源须要清理,那么就不须要重写Dispose方法了,正如咱们平时作的一些对话框,虽然都是继承于System.Windows.Forms.Form,但咱们经常不须要去重写基类Form的Dispose方法,由于自己没有什么非托管的咚咚须要释放。

了解GC的脾性在不少时候是很是必要的,起码在出现资源泄漏问题的时候你不至于手足无措。我写过一个生成excel报表的控件,其中对excel对象的释放就让我忙活了一阵。若是你作过excel开发的话,可能也遇到过结束excel进程之类的问题,特别是包装成一个供别人调用的库时,什么时候释放excel对象以确保进程结束是一个关键问题。固然,GC的内部机制很是复杂,还有许多内容可挖,但了解全部细节的成本过高,只需了解基础,够用就好。

  • using() 语法有用吗?什么是IDisposable?它是如何实现肯定性终结的。 

using()能自动调用Dispose方法

好比:using()会自动调用MyObject的Dispose方法

using ( MyObject myObject = new MyObject ( ) )

{

   Console.WriteLine ( "quit" ) ;

}

 

 

IDisposiable是显示释放对象的接口,实现IDisposiable接口的类,能够显示的释放对象。

,经过编写Dispose方法来实现显式释放资源;

// C#

class MyClass : IDisposable

{

public MyClass() {} // 构造函数

~MyClass() {} // 析构方法 (不肯定的) (编译器经过重载virtual void Finalize来实现),与C++/CLI的!MyClass()等效

public void Dispose() {} // Dispose方法 

public static void Test()

{

using(MyClass auto = new MyClass()) 

{ /* 使用auto对象 */ }

// 由于使用了using句法,编译器自动调用auto.Dispose() 

// 以上代码等效于: 

MyClass user = new MyClass();

try { /* 使用user对象 */ }

finally { user.Dispose(); }

}

}

 

  • tasklist /m "mscor*" 这句命令是干吗的? 

列出全部使用了以" mscor"做为开头的dll或者exe的进程和模块信息

  • in-proc和out-of-proc的区别 

in-proc是进程内,进程内能共享代码和数据块,out-of-proc是进程外,进程外的互操做须要用进程间通信来实现。

  • .NET里的哪一项技术可以实现out-of-proc通信? 

.Net Remoting技术或者WCF技术

  • 当你在ASP.NET中运行一个组件时,它在Windows XP, Windows 2000, Windows 2003上分别跑在哪一个进程里面? 

Xp : aspnet_Wp.exe 

Windows 2000 : inetinfo.exe 

Windows 2003 : w3wp.exe

相关文章
相关标签/搜索