对一些面试题的回答

此文中所提到的面试题是园子中Tony Qu兄弟翻译过来的,特此感谢

NET牛人应该知道些什么?
(本答复不是标准答案,敬请兄弟们补充更正,不胜感激)


任何一个使用
.NET的人


1) 描述线程与进程的区别?

线程(Thread)与进程(Process)二者都定义了某种边界,不同的是进程定义的是应用程序与应用程序之间的边界,不同的进程之间不能共享代码和数据空间,而线程定义的是代码执行堆栈和执行上下文的边界。一个进程可以包括若干个线程,同时创建多个线程来完成某项任务,便是多线程。而同一进程中的不同线程共享代码和数据空间。用一个比喻来说,如果一个家庭代表一个进程,在家庭内部,各个成员就是线程,家庭中的每个成员都有义务对家庭的财富进行积累,同时也有权利对家庭财富进行消费,当面对一个任务的时候,家庭也可以派出几个成员来协同完成,而家庭之外的人则没有办法直接消费不属于自己家庭的财产。

2) 什么是Windows服务,它的生命周期与标准的EXE程序有什么不同

Windows服务是运行在windows后台指定用户下(默认System)的应用程序,它没有标准的UI界面,想比标准的EXE程序,Windows服务是在服务开始的时候创建,而在服务结束的时候销毁,而且可以设置服务是否与操作系统一起启动,一起关闭。它支持三种方式:1)自动方式 2)手动方式 3)禁用 。自动方式的时候,windows服务将在OS启动后自动启动运行,而手动方式则必须手工启动服务,禁用的情况下服务将不能被启动。另外标准的EXE默认使用的当前登录的用户,而windows服务则默认使用System用户,这在对系统资源访问的时候特别需要注意。

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

这个需要针对硬件平台,公式为单个进程能访问的最大内存量=2的处理器位数次方/2,比如通常情况下,32位处理器下,单个进程所能访问的最大内存量为:232 /2 = 2G 。单个进程能访问的最大内存量是最大虚拟内存的1/2,因为要分配给操作系统一半虚拟内存。

4)  什么是强类型,什么是弱类型?哪种更好些?为什么?

强类型是在编译的时候就确定类型的数据,在执行时类型不能更改,而弱类型在执行的时候才会确定类型。没有好不好,二者各有好处,强类型安全,因为它事先已经确定好了,而且效率高。一般用于编译型编程语言,如c++,java,c#,pascal,弱类型相比而言不安全,在运行的时候容易出现错误,但它灵活,多用于解释型编程语言,如javascript,vb

5)  PID是什么?在做系统的故障排除时如何使用它?

PID是进程编号,在系统发现故障的时候,可以根据它寻找故障所发生的具体进程,并且可通过visual studio.netide将故障进程附加到进程中进行调试(debug)

6)  单个TCP/IP端口上能够被多少个进程侦听?

可以为多个,多个为端口复用 (多谢蛙蛙池塘的提醒)
看下面代码

端口复用

 

7)  什么是GAC?它解决了什么问题?

Gloal Assembly Cache,全局应用程序集缓存。它解决了几个程序共享某一个程序集的问题。不必再将那个被共享的程序集拷贝到应用程序目录了,其实这道理很简单,.net应用程序在加载的时候,会首先查看全局应用程序集缓存,如果有就可以直接使用,没有再到应用程序目录进行查找。

 

中级.NET开发人员

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

面向接口更关注的是概念,它的原则是先定义好行为规范,再根据行为规范创建实现,严格的来说,面向接口应该是面向对象中的一部分吧,因为面向对象也强调的是依赖倒置原则,也就是实现依赖于抽象,而抽象不依赖于具体实现,更具比较的应该是面向接口与面向抽象对象,我的体会是面向接口更加灵活,但实现时候,稍微有些代码冗余,而面向抽象可以结合面向接口,先定义接口,再定义抽象类,在抽象类中处理一些公共逻辑,再实现具体实现类。面向对象是对复杂问题的分解。面向方面的编程是一种新概念,它解决了很多面向对象无法解决的问题,比如面向对象技术只能对业务相关的代码模块化,而无法对和业务无关的代码模块化。而面向方面正是解决这一问题的方案,它的关键思想是"将应用程序中的商业逻辑与对其提供支持的通用服务进行分离"。

2)  什么是Interface?它与Abstract Class有什么区别?

接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类

3)  什么是反射?

程序集包含模块,而模块又包括类型,类型下有成员,反射就是管理程序集,模块,类型的对象,它能够动态的创建类型的实例,设置现有对象的类型或者获取现有对象的类型,能调用类型的方法和访问类型的字段属性。它是在运行时创建和使用类型实例

4)  使用ASMXXML Web服务与使用SOAP.NET Remoting的区别?

Web服务使用的消息机制,而Remoting采用的RPC. Web Service能用于不同平台,不同语言,Remoting只适用于.Net。效率上Remoting高于Xml Web Service

5)  类型系统是由XMLSchema表示的吗?CLSXMLSchema表示的吗?

不清楚 

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

这个就像是强弱类型的比较相似,前期绑定是在编译的时候就确定了要绑定的数据,而后期绑定是在运行的时候才填充数据。所以前期绑定如果失败,会在编译时报编译错误,而后期绑定失败只有在运行时的时候才发生

7)  调用Assembly.Load算静态引用还是动态引用?

动态

8)  何时使用Assembly.LoadFrom?何时使用Assembly.LoadFile

呵呵,这个比较有意思,相比LoadFileLoadFrom则显得不地道,因为它娶媳妇的时候,是让人家穿上嫁妆,坐上马车,还得带着人家的妹妹来,:)用它加载的是程序集,这就要求同时将此程序集所依赖的程序集加载进来。而LoadFile就地道的多,它是加载程序集文件的内容,只将传入参数的文件加载,不考虑程序集依赖,但如果有相同实现,但位置不同的文件用LoadFrom是不能同时加载进来的,而LoadFile却可以。由于LoadFile加载的是文件,所以调用它之后,可能因为缺少必要的依赖造成无法被执行。

9)  什么叫Assembly Qualified Name?它是一个文件名吗?它有什么不同?

它不是一个文件名,相比文件名,Assembly Qualified Name(程序集限定名称),更能确定一个程序集,它包含文件名,但同时包含版本,公钥,和区域。因为同样一个名称的文件可能有不同的版本和区域,此时单独靠文件名称,可能会造成不能确定程序集的正确性。

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

错误,正确的应该是Assembly.Load("foo"); 或者Assembly.LoadFrom("foo.dll"); (多谢 Tristan(Guozhijian)的提示更正)

11) 做强签名的assembly与不做强签名的assembly有什么不同?

强签名的程序集可以做成com,而不做强签名的就不行,同样强签名程序集可以安装到GAC中,而不做强签名的确不能。

12)  DateTime是否可以为null?

不能,因为其为Struct类型,而结构属于值类型,值类型不能为null,只有引用类型才能被赋值null

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

Just In Time 及时编译,它是在程序第一次运行的时候才进行编译,而NGEN是所谓的pre-jit,就是说在运行前事先就将生成程序集的本机镜像,并保存到全局缓存中,适用NGEN可以提高程序集的加载和执行速度,因为它可以从本机映像中还原数代码和数据结构,而不必像jit那样动态生成它们。感觉和缓存的道理大同小异。

14)  Finalize()Dispose()之间的区别?

Finalize()用于隐式释放资源,Dispose()用于显示释放资源 (Finalize()的确相当于C++中的析构函数(多谢Jeffrey Zhao提示更正)

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

有用,实现了IDisposiable的类在using中创建,using结束后会自定调用该对象的Dispose方法,释放资源。不明白什么是确定性终结

16)  tasklist /m "mscor*" 这句命令是干嘛的

列出所有使用了以" mscor"作为开头的dll或者exe的进程和模块信息

17)  in-procout-of-proc的区别

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

18)  .NET里的哪一项技术能够实现out-of-proc通讯?

.Net Remoting技术或者WCF技术

19) ASP.NETWindows XP, Windows 2000, Windows 2003上分别跑在哪个进程里面?

Xp : aspnet_Wp.exe
Windows 2000 : aspnet_Wp.exe (多谢 Tristan提示更正)
Windows 2003 : w3wp.exe

作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
Tag标签: 面试题答案
posted @ 2008-02-28 17:59 Robin Zhang 阅读(8527) 评论(79)  编辑 收藏 网摘 所属分类: .net framework

  回复  引用    
#1楼2008-02-28 18:10 | Yok。[未注册用户]
最后一题。。。win2000也是aspnet_wp吧
  回复  引用  查看    
#2楼[楼主]2008-02-28 18:12 | jillzhang      
@Yok。
没用过2000,只是猜测是inetinfo,你用的2000么?

  回复  引用  查看    
#3楼2008-02-28 18:13 | 工业酒精      
笔试还是面试啊?

能全部回答出来还真是牛X。。。。

让我拿着题目聊聊还行,要是让我当堂笔试,估计看到题目就准备打退堂鼓了。。。。

  回复  引用    
#4楼2008-02-28 18:45 | JustYxY[未注册用户]
兄弟你辛苦了,不过觉得你的答案不够完整
比如:
Finalize()和Dispose()之间的区别?

Finalize()用于释放非托管资源,Dispose()用于释放托管资源

这题的答案很有问题

希望你在详细写,要么不做要做就不要有别人反驳你的理由

  回复  引用  查看    
#5楼2008-02-28 18:51 | Jeffrey Zhao      
Finalize()和Dispose()之间的区别?
using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的。
这两题的答案有问题。

其他有些也不够准确。

  回复  引用  查看    
#6楼2008-02-28 19:36 | Tristan(Guozhijian)      
10) Assembly.Load("foo.dll"); 这句话是否正确?

这个好像不正确的说。

  回复  引用  查看    
#7楼2008-02-28 19:39 | Tristan(Guozhijian)      
win2000是aspnet_wp
  回复  引用  查看    
#8楼2008-02-28 19:42 | Tristan(Guozhijian)      
我理解的

反射是

通过元数据来发现类型信息等

  回复  引用  查看    
#9楼2008-02-28 21:24 | carysun      
这该是打算做.NET牛人必须知道的吧
  回复  引用  查看    
#10楼2008-02-28 22:21 | 笑清风      
===========================================
中级.NET开发人员
=====================================
10) Assembly.Load("foo.dll"); 这句话是否正确?

正确
===================================
好像正确的是Assembly.Load("程序集的名称");

  回复  引用  查看    
#11楼[楼主]2008-02-28 22:41 | jillzhang      
@Jeffrey Zhao
请指示,我只是按照自己理解的意思随便写写,摘要也说明了,不过我想我更欣赏老赵给出正确的答复。

@JustYxY
你也是,欢迎进一步指正


  回复  引用  查看    
#12楼[楼主]2008-02-28 22:47 | jillzhang      
10) Assembly.Load("foo.dll"); 这句话是否正确?

正确
===================================
好像正确的是Assembly.Load("程序集的名称");
---------------------------------------
多谢提示,你说的是正确的。马上改正

  回复  引用  查看    
#13楼[楼主]2008-02-28 23:02 | jillzhang      
现在园子访问太慢,明天改
  回复  引用  查看    
#14楼[楼主]2008-02-28 23:06 | jillzhang      
@Tristan(Guozhijian)
兄弟确定么 ?你用的是2000?没用过2000,你确定的话,我明天一并改

  回复  引用    
#15楼2008-02-28 23:30 | Text[未注册用户]
值类型不是也可以定义为空的吗 加上?
  回复  引用  查看    
#16楼[楼主]2008-02-28 23:33 | jillzhang      
@Tristan(Guozhijian)
这个说法不对,我理解反射一定要强调在运行时创建和使用类型实例,而不是在编译时

  回复  引用  查看    
#17楼[楼主]2008-02-28 23:34 | jillzhang      
@Text
可DataTime不是DateTime?而且?是2.0新增内容,一直没舍得使用。不太了解是否加上它就将类型转换成引用类型了呢。反正1.1的时候,是说值类型不能赋值为null的,应该不会变

  回复  引用  查看    
#18楼2008-02-29 07:46 | BlackCat      
mark
  回复  引用  查看    
#19楼2008-02-29 08:34 | 高海东      
不错啊
  回复  引用  查看    
#20楼2008-02-29 08:53 | 曲滨*銘龘鶽      
怎么没高级?
  回复  引用  查看    
#21楼2008-02-29 09:08 | Tristan(Guozhijian)      
@jillzhang
兄弟确定么 ?你用的是2000?没用过2000,你确定的话,我明天一并改

--------------

确定,我们有几台服务器是win2000。我清楚。

  回复  引用  查看    
#22楼2008-02-29 09:10 | Tristan(Guozhijian)      
@jillzhang
这个说法不对,我理解反射一定要强调在运行时创建和使用类型实例,而不是在编译时

-------
我没有说是编译时。
是运行时通过元数据发现类型信息。

我觉得重点是发现,而不是创建和使用。

  回复  引用  查看    
#23楼2008-02-29 09:11 | Tristan(Guozhijian)      
好像正确的是Assembly.Load("程序集的名称");
-------

这样还是不准确,Assembly.Load有几个重载的

  回复  引用  查看    
#24楼2008-02-29 09:14 | Tristan(Guozhijian)      
Finalize()用于释放非托管资源,Dispose()用于释放托管资源 (我的理解是Finalize()相当于析构函数)

---------

我觉得应该反过来。
比如:我们一般会在dispose里面释放DataBase连接,这个是非托管资源

  回复  引用  查看    
#25楼[楼主]2008-02-29 09:14 | jillzhang      
@Tristan(Guozhijian)
不明白你说的发现有什么特别含义

  回复  引用  查看    
#26楼[楼主]2008-02-29 09:17 | jillzhang      
@Tristan(Guozhijian)
比如:我们一般会在dispose里面释放DataBase连接,这个是非托管资源
-------------------------------------------------------------
明显有问题,Close才会释放dbconnection,dispose后不行,这也是为何有的对象为何有Dispose还有Close的原因,Dispose是释放GC能管理的资源,而Close相当于Dispose()然后再释放一些GC无法显示回收的资源,如Socket连接,DB连接,和对一些非托管资源的使用,如窗口句柄等

  回复  引用  查看    
#27楼2008-02-29 09:26 | Tristan(Guozhijian)      
呵呵,我一般不调用Connection的Close方法.

我只好搬MSDN了


http://msdn2.microsoft.com/en-us/library/system.idisposable.dispose.aspx" target="_new">http://msdn2.microsoft.com/en-us/library/system.idisposable.dispose.aspx

.NET Framework Class Library
IDisposable..::.Dispose Method

Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.

  回复  引用    
#28楼2008-02-29 09:28 | zyz[未注册用户]
aspnet_wp.exe
2000下确实是这个

  回复  引用  查看    
#29楼2008-02-29 09:30 | 老四      
这些问题,大多都是知道一点不是很清楚的那种。常看看也是有好处的。只是这样题用于面试的笔试,我觉得好像有些不妥当。不过仁者见仁了,还看公司是要招什么样的人。
  回复  引用  查看    
#30楼2008-02-29 09:30 | 阿多斯      
很好,很有收获。
好些知识以前看过,比如GAC,但是都几乎忘了
看了楼主这篇文章才想起来。
不准确的问题建议大家一起讨论,把答案标准化

  回复  引用  查看    
#31楼2008-02-29 09:38 | Jeffrey Zhao      
@jillzhang
Dispose和Close方法只是名称上的不同,Close更“友善”一些,Dispose只是为了实现IDisposable,两者没有什么GC与否之分。
对于垃圾收集来说,是不是显式设为null是没有关系的,该回收的在某次GC后总是回收(因为相关引用的对象也一起回收了),也就是说,托管资源是没有必要显式“释放”的。

  回复  引用  查看    
#32楼[楼主]2008-02-29 09:41 | jillzhang      
@Jeffrey Zhao
我觉得上面的说法是不对的,如果只是更友善一些,DbConnection为何要实现两个?

  回复  引用  查看    
#33楼2008-02-29 09:44 | Jeffrey Zhao      
@Jeffrey Zhao
Dispose方法和~XXX(也就是Finalize方法)都是用于释放非托管资源的。Dispose是可控制的、可强制的(用using或直接调用),~XXX是GC负责调用的,它是最后一道防线,不过会影响GC,因为直到GC第二次对象才会被回收。
一般实现~XXX的类是强烈建议要实现IDisposable的,而且一定要用Dispose Pattern。这时候你会发现~XXX方法里就是在调用this.Dispose。

  回复  引用  查看    
#34楼[楼主]2008-02-29 09:46 | jillzhang      
@Tristan(Guozhijian)
_
Private Shared Function CloseHandle(ByVal handle As IntPtr) As [Boolean]
------------------------------------------------
看到这里,我觉得有关Dispose和Close的论断更清晰了

它的那个示例明显在Dispose中调用了Kernel32中的方法,这样也可以实现关闭非托管资源,因为本身Kernel32就能够管理很多这些资源

  回复  引用  查看    
#35楼2008-02-29 09:47 | Tristan(Guozhijian)      
我觉得 DBConnection的 Close()方法只是释放数据库连接
而Dispose()可能释放的东西更多更彻底一些。

Dispose可能这样实现:

{
this.Close();
//release other unmanaged resources
}

  回复  引用  查看    
#36楼2008-02-29 09:48 | Jeffrey Zhao      
@jillzhang
建议可以查看一下相关资料,Close的确是为了名称上友善一些(“关闭”一个连接比“销毁”一个连接来的自然),仅此而已。

  回复  引用  查看    
#37楼[楼主]2008-02-29 09:49 | jillzhang      
@Tristan(Guozhijian)
正好相反,我觉得CLose释放更加彻底,不如做个小的测试

  回复  引用  查看    
#38楼2008-02-29 09:49 | Tristan(Guozhijian)      
Dispose方法和~XXX(也就是Finalize方法)都是用于释放非托管资源的。Dispose是可控制的、可强制的(用using或直接调用),~XXX是GC负责调用的,它是最后一道防线,不过会影响GC

同意这个提法 :)

Dispose是显示释放
Finalize是隐式释放

  回复  引用  查看    
#39楼2008-02-29 09:50 | Jeffrey Zhao      
@Tristan(Guozhijian)
其实是Close里调用Dispose方法——而且只是调用了Dispose方法,一般类都这么写,除非需要记录点特别的,比如统计多少人显示调用了Close方法,呵呵。

  回复  引用  查看    
#40楼[楼主]2008-02-29 09:51 | jillzhang      
@Jeffrey Zhao
相关资料能指示下连接么?我看看,因为此处我学习的时候,一直认为Close和Dispose是不一样的。希望能通过此次得以矫正

  回复  引用  查看    
#41楼2008-02-29 09:53 | Tristan(Guozhijian)      
嗯,那个关系我也只是猜测 :)
  回复  引用  查看    
#42楼2008-02-29 09:55 | Jeffrey Zhao      
《CLR via C#》 by Jeffrey Richter。
我一直觉得作为.NET程序员把这本书内容都吸取了就足够了。

  回复  引用  查看    
#43楼2008-02-29 09:57 | Tristan(Guozhijian)      
@Jeffrey Zhao
《CLR via C#》 by Jeffrey Richter。
我一直觉得作为.NET程序员把这本书内容都吸取了就足够了。
----------------------------

中文版翻过了。正在看英文版。 ^_^

  回复  引用  查看    
#44楼2008-02-29 09:59 | 汉广      
Dispose()
好像设计用来让程序员“显示的”(explicitly)释放资源,有时候垃圾回收需要做很多事,explicitly的释放能提高效率

-------------------------
汉广同学正在找工作,你可以点击http://www.cnblogs.com/osamede/archive/2008/02/26/1082044.html">这里 ,浏览他的简历。简历仍在修改中,我会心怀感激的阅读你的任何评论:-)

  回复  引用  查看    
#45楼2008-02-29 09:59 | Jeffrey Zhao      
@Tristan(Guozhijian)
是我刚才错了,我去确认了一下,Dispose调用Close/Close调用Dispose都有,呵呵。
Close/Dispose/Finalize的关系是:
如果没有Dispose,那么另两个也没有了。
有Close或Finalize,它们和Dispose做的事情一般其实一样,一般就是相互调用而已。
实现IDisposable时就实现Dispose Pattern。

  回复  引用  查看    
#46楼2008-02-29 10:02 | 毁于随      
using() 语法有用吗?什么是IDisposable?它是如何实现确定性终结的 --------------终结性的意思,应该是被GC回收资源吗?这个要讲GC回收机制了.我想知道,真正的大公司面试的时候真的会考这些吗?因为我是做C/S的,工作中Mobile的程序多些,B/S的了解的相对要少很多,但是上面的大部分题目我都可以答得上来,什么样的公司才会考这些基础知识?而不是要求CSS,JS,AJAX??
  回复  引用  查看    
#47楼[楼主]2008-02-29 10:06 | jillzhang      
我在SqlConnection上找到两段代码
public override void Close()
{
IntPtr ptr;
Bid.ScopeEnter(out ptr, " %d#", this.ObjectID);
try
{
SqlStatistics statistics = null;
RuntimeHelpers.PrepareConstrainedRegions();
try
{
statistics = SqlStatistics.StartTimer(this.Statistics);
lock (this.InnerConnection)
{
this.InnerConnection.CloseConnection(this, this.ConnectionFactory);
}
if (this.Statistics != null)
{
ADP.TimerCurrent(out this._statistics._closeTimestamp);
}
}
catch (OutOfMemoryException exception3)
{
this.Abort(exception3);
throw;
}
catch (StackOverflowException exception2)
{
this.Abort(exception2);
throw;
}
catch (ThreadAbortException exception)
{
this.Abort(exception);
throw;
}
finally
{
SqlStatistics.StopTimer(statistics);
}
}
finally
{
SqlDebugContext context = this._sdc;
this._sdc = null;
Bid.ScopeLeave(ref ptr);
if (context != null)
{
context.Dispose();
}
}
}


protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}






-----------------------------------------------------------


public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}


我以前的理解的确有些问题,Dispose调用了Close这是肯定了,Close也调用了Dispose


  回复  引用  查看    
#48楼2008-02-29 10:08 | Tristan(Guozhijian)      
嗯,想来Dispose和Close谁调谁只是一个习惯问题而已。或者只是凑巧。

只要关心如何实现IDisposable接口就可以了。 IDisposable接口并没有定义Close方法。
应该撇开Close方法谈IDisposable

  回复  引用  查看    
#49楼2008-02-29 10:10 | 毁于随      
这个东西真是忙烦,不明白为什么要这样设计.当初学.Net框架程序设计的时候就有些晕.
  回复  引用  查看    
#50楼[楼主]2008-02-29 10:13 | jillzhang      
不对,以前我的理解还是正确的
原因如下:
针对SqlConnection,我说的是其Dispose()而不是protected 的Dispose(Boolean),从代码上可以看出Dispose(boolean)的确调用了Close()进行了显示关闭,但如果只调用SqlConnection的Dispose方法,是不会关闭连接的,因为DisposeO是SqlConnection基类Compent的公共方法,它是实现是
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}

如果只调用Dispose()。按照代码的执行,完全不会调用Close()

但Dispose(true)的时候,相当于调用了Close(),和所有基类下的Dispose()

  回复  引用  查看    
#51楼[楼主]2008-02-29 10:15 | jillzhang      
@Tristan(Guozhijian)
你平时的做法,只调用conn.Dispose(),而不调用Close()绝对是不对的
它关闭不了连接,至于连接最终为何还会关闭,可能就是GC的功劳,确切地说是是Finalize()隐式释放的功劳

  回复  引用  查看    
#52楼[楼主]2008-02-29 10:32 | jillzhang      
但是对于Dispose与Finalize的认识,我的说法的确是不正确的。它们不是托管非托管的问题
  回复  引用  查看    
#53楼2008-02-29 10:57 | 风海迷沙      
完整版在这里:
http://www.yeeyan.com/articles/view/15070/5074" target="_new">http://www.yeeyan.com/articles/view/15070/5074
.NET牛人应该知道些什么

去受更多的打击吧

  回复  引用    
#54楼2008-02-29 11:23 | A.Z![未注册用户]
in-proc和out-of-proc的区别
其实我觉得问xx和xx的区别有很大的可能产生误导
比如我你adapter和dataset的区别
我认为in-proc和out of proc更多的是在COM层面的概念

对.net而言只有appdomain.

  回复  引用  查看    
#55楼[楼主]2008-02-29 11:34 | jillzhang      
@A.Z!
我的理解是根绝Session的保存来的
Session有三种保存方式
InProc表示在进程内in-proc(.net里面有appdomain,其实类似于子进程)
也可以保存在StateServer,这种方式就是进程外out-of-proc
进程内外的说法和com+有关是因为其更多的涉及到分布式处理
可设计到进程内外概念的不光是com,.Net Remoting技术实现的进程间通讯也是进程外的访问

  回复  引用  查看    
#56楼2008-02-29 13:22 | Jeffrey Zhao      
@jillzhang
不知道你的理解是哪里获得的,Close方法和Dispose方法真的在相当程度上只是一个方法名而已,调用Dispose方法Connection就Close了。你看一下SqlConnection的Dispose方法的源代码吧,里面就会调用Close方法。
其实这些在《CLR via C#》里都已经说清楚了。
如果真要说Close和Dispose的区别,应该是Dispose调用后对象就不可用了(设计上),而Close掉的东西某些情况可以再Open。

  回复  引用  查看    
#57楼[楼主]2008-02-29 13:36 | jillzhang      
@Jeffrey Zhao
我不管《CLR via C#》怎么说
看下SqlConnection的实现就很清楚了。
我只是说调用conn.Disppse()不会显示释放连接,但并没有说它不会因为Finalize的存在而隐式关闭。所以通常情况下看起来是一样的。但真实上是确确实实的不一样。
-------------------------------------------------------
不信,老赵你也可以反编译一下SqlConnection,他的Dispose(true),是受保护的,那个函数的确调用了Close(),但我们经常用到的conn.Dispose()是compent的Dispose(),Compent是SqlConnection基类DbConnection的基类,它怎么能和SqlConnection下公共方法Close的作用一样呢?


至于那本书为何那么说,我想可能也是有一定问题的。至少我从.net framework代码中找到的答案可以否定他那种说法

  回复  引用  查看    
#58楼[楼主]2008-02-29 13:41 | jillzhang      
我这次很确定,因为我在反编译出来的SqlConnection中根本没有发现Dispose()方式的实现,注意是Dispose(),而不是受保护的Dispose(Boolean),而且在SqlConnection对象实例上也可以清晰的看到Dispose()是Compent的,那抽象不依赖于实现,实现依赖于抽象,Compent作为SqlConnection的基类的Dispose()方法是说什么也不可能调用SqlConnection的Close方法从而实现连接关闭的。只不过是Dispose()后将Compent所使用的资源显示释放了,而此时连接并没有关闭,关闭的功劳要归功于SqlConnection的Finalize()
  回复  引用  查看    
#59楼[楼主]2008-02-29 13:53 | jillzhang      
;)
明白了
是我错了
Dispose()调用了被重写的Dispose(boolean),从而调用了Close()方法,老赵尼说的对,看来Dispose()要比Close()还要彻底

  回复  引用  查看    
#60楼2008-02-29 13:55 | Jeffrey Zhao      
@jillzhang
:)

  回复  引用  查看    
#61楼2008-02-29 13:55 | Tristan(Guozhijian)      

SqlConnection不需要再重写Dispose方法,因为它从基类集成来了。

Close方法在子类中是override的
也就是说基类中也定义了virtual或abstract的Close方法,那么它(基类)调一下这个方法有什么问题?

  回复  引用  查看    
#62楼[楼主]2008-02-29 13:56 | jillzhang      
不好意思,刚才有些激动。误导了大家,深表歉意
老赵说得对,Dispose比Close还要彻底。
我原来这是从哪里道听途说的亚,早都忘了。不过一直这么以为来着,现在明白了。

Compent实现了Finalize(),不过调用Dispose后就GC.SuppressFinalize(this);了

代码不骗人。这次收获还是挺大。要不还一直错着呢

  回复  引用  查看    
#63楼[楼主]2008-02-29 13:59 | jillzhang      
@Tristan(Guozhijian)
主要是当时看Compent的时候,没看见它的那个
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
lock (this)
{
if ((this.site != null) && (this.site.Container != null))
{
this.site.Container.Remove(this);
}
if (this.events != null)
{
EventHandler handler = (EventHandler) this.events[EventDisposed];
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
}

  回复  引用  查看    
#64楼2008-02-29 14:00 | Tristan(Guozhijian)      
呵呵,否则我两年的代码就被你推翻了
  回复  引用  查看    
#65楼[楼主]2008-02-29 18:20 | jillzhang      
@Tristan(Guozhijian)
你说要是万一是我说对了,你可就惨了,可万幸的是我说错了,:)兄弟偷着乐吧

  回复  引用  查看    
#66楼2008-02-29 18:49 | Tristan(Guozhijian)      
呵呵,好在我写代码不是想当然的。
  回复  引用  查看    
#67楼[楼主]2008-02-29 20:05 | jillzhang      
@Tristan(Guozhijian)
我写代码是想当然的

  回复  引用  查看    
#68楼2008-03-01 13:17 | 蛙蛙池塘      
针对初级里面的第6个问题,楼主听过端口复用吗?
  回复  引用  查看    
#69楼2008-03-01 13:26 | 蛙蛙池塘      
参考链接:
http://topic.csdn.net/t/20020605/10/779490.html
http://www.cnblogs.com/wzd24/archive/2007/05/22/755016.html

其余的问题大多都在《clr框架设计》及《windows核心编程》《asp.net 2.0内幕》里有讲,没多大争议,所以平时多看书,应该会多这些问题有一定的了解。

  回复  引用  查看    
#70楼2008-03-01 13:33 | 蛙蛙池塘      
@曲滨*銘龘鶽

高级开发人员/架构师

  • DateTime.Parse(myString); 这行代码有什么问题?
  • PDB是什么东西? 在调试中它应该放在哪里?
  • 什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
  • 写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查",
  • 什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
  • 代码加上需要安全权限的特性有什么好处?
  • gacutil /l | find /i "Corillian" 这句命令的作用是什么?
  • sn -t foo.dll 这句命令是干嘛的?
  • DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
  • 对比OOP和SOA,它们的目的分别是什么?
  • XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
  • 为什么不提倡catch(Exception)?
  • Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
  • Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
  • JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
  • 对比抽象基类和接口的使用
  • a.Equals(b)和a == b一样吗?
  • 在对象比较中,对象一致和对象相等分别是指什么?
  • 在.NET中如何实现深拷贝(deep copy)?
  • 请解释一下IClonable
  • 什么叫装箱?
  • string是值类型还是引用类型?
  • XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
  • 为什么不应该在.NET中使用out参数?它究竟好不好?
  • 特性能够放到某个方法的参数上?如果可以,这有什么用?

C# 组件开发人员

  • 什么时候使用override?什么时候使用new? 什么叫shadowing?
  • 解释virtual、sealed、override和abstract的区别
  • Foo.Bar, Version=2.0.205.0, Culture=neutral, PublicKeyToken=593777ae2d274679d 解释这个字符串每个部分的重要性和作用
  • 解释public、protected、private和internal的区别
  • 使用Primary Interop Assembly (PIA)有什么好处?
  • NUnit是通过什么机制获知需要测试哪些方法的?
  • catch(Exception e){throw e;}和catch(Exception e){throw;}的区别
  • typeof(foo)和myFoo.GetType()的区别?
  • public class c{ public c(string a) : this() {;}; public c() {;} } 解释第一个构造函数中发生了什么? 这个构造函数有什么用?
  • this是干嘛用的?能够用在static方法中?

ASP.NET (UI)开发人员

  • 阐述一个基于浏览器的Form POST如何变成一个服务器端的事件,如Button1_OnClick。
  • 什么是PostBack?
  • 什么是ViewState? 它是否被编码过? 是否被加密过?谁会使用ViewState?
  • <machinekey>元素是干嘛用的?它用于哪两项ASP.NET技术?
  • 说出ASP.NET 1.1中的3种Session State提供程序以及它们的优缺点?
  • 什么叫Web Gardening? 在设计中如何使用它?
  • 假设有一个ASP.NET应用程序,那么单独一个进程中允许多少应用程序对象?那两个进程呢?启用了Web Gardening的2个进程呢?这对设计有何影响?
  • ASP.NET会重用多个请求之间的线程吗?是否每个HttpRequest都有自己的线程?你是否应该用ASP.NET的Thread Local存储?
  • [ThreadStatic]属性在ASP.NET中有用吗?它有没有副作用?是好是坏?
  • 如何使用HttpHandler简化现有的为.aspx页面提供验证图片的设计
  • HttpModule订阅的是什么类型的事件? 这对于实现有何影响?如果不打算重新编译ASP.NE应用程序,应该怎么做?
  • 说出表示任意一个终端(URL)的方式,以及ASP.NET中把请求路由到那个终点的方式
  • 解释cookie的工作原理。给出一个滥用Cookie的例子。
  • 解释HttpRequest.ValidateInput()的重要性?
  • 哪些数据是通过HTTP Header传递的?
  • 对比HTTP动词GET和POST? 什么是HEAD?
  • 说出至少6个HTTP状态码以及它们的含义
  • if-not-modified-since的工作原理是什么? 用ASP.NET如何实现它?
  • 解释 <@OutputCache%>和如何使用VaryByParam、VaryByHeader.
  • VaryByCustom是如何工作的?
  • 如何通过q=? (除了q=5)来实现ASP.NET HTML输出缓冲和缓冲过期(比如http://localhost/page.aspx?q=5" href="http://localhost/page.aspx?q=5">http://localhost/page.aspx?q=5)?

XML开发人员

  • XML命名空间的作用?
  • 何时适合使用DOM?何时不适合?有没有尺度限制?
  • 什么是WS-I基本配置?它重要在哪里?
  • 写一个小XML文档,其中使用的是默认的命名空间,以及一个合法的(前缀)命名空间,其中要有分别属性这两个命名空间的元素
  • 元素和特性的基本区别在哪里?
  • 格式完好的XML和有效的XML有什么区别?
  • .NET中如何验证XML?
  • myXmlDocument.SelectNodes("//mynode"); 为什么这句代码不好?什么时候它是好的?
  • 拉式解析(XmlReader)与事件读取器(Sax)的区别
  • XPathDocument和XmlDocument的区别? 在何种情况下应该用哪一个?
  • “XML片断”与“XML文档”有什么区别
  • 什么叫格式规范的XML?
  • XML InfoSet规范与Xml DOM有什么不同? InfoSet是要解决什么问题?
  • 比较DTD和XSD,它们的相似点与区别分别是什么?哪个更好些?为什么?
  • System.Xml支持DTD吗?如果支持,如何使用?
  • XML Schema能够表示为对象图?对象图能够表示为XML Schema

你来回答吧,呵呵


  回复  引用  查看    
#71楼2008-03-01 13:37 | 蛙蛙池塘      
http://www.cnblogs.com/Emoticons/tusiji/202939796.gif" alt="" />后面的问题还是有一些深度的,没有参考资料基本答不好。大家可以参考问题,查一些资料,多了解一些,大多问题在工作中还是会遇到的。
  回复  引用  查看    
#72楼[楼主]2008-03-01 14:46 | jillzhang      
针对初级里面的第6个问题,楼主听过端口复用吗?

--------------------------------------------
忘记了,那个帖子我也参与过谈论

多谢提醒

  回复  引用  查看    
#73楼2008-03-02 10:56 | 随风流月      
@蛙蛙池塘
稍稍看了一下,难度不是很大。
XML 的部分,现在似乎应该考 Xml to LINQ 了,一笑。
ASP.net 的部分,因为打死我也不用 Postback 的缘故,很多答不上来。

  回复  引用  查看    
#74楼[楼主]2008-03-02 11:01 | jillzhang      
@随风流月
下面的你来回答下吧,我有些是回答不上来的,或者是理解模糊的。

  回复  引用    
#75楼2008-03-02 13:01 | Duron800[未注册用户]
我从字面理解Dispose是销毁,Close是关闭;关闭的可以再打开,销毁的话就要重新再建立新的了。
  回复  引用    
#76楼2008-03-03 02:21 | 支持下[未注册用户]
很不错学习了
  回复  引用  查看    
#77楼2008-03-13 10:02 | 斧头帮少帮主      
@蛙蛙池塘
看来我还有好多东西要学习.

  回复  引用  查看    
#78楼2008-11-25 18:15 | 大李      
看来我还有好多东西要学习.
  回复  引用  查看    
#79楼2009-01-07 19:58 | 小狼狗      
看看 继续



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1085205





相关文章:

相关链接: