后台管理 - Deper - 博客园 : 编辑文章 ".NET牛人应该知道些什么(3):高级开发人员/架构师"

 本系列共六篇:

(1):所有.NET程序员必知的

(2):中级.NET开发人员

(3):高级开发人员/架构师

(4):C# 组件开发人员

(5):ASP.NET (UI)开发人员

(6):XML开发人员

 

1.DateTime.Parse(myString); 这行代码有什么问题?

答:由于myString不一定是正确的时间格式,所以这行代码可能会现出异常,可以用DateTime.TryParse(myString)来代替。
 

 

2.PDB是什么东西? 在调试中它应该放在哪里?

答:PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。

 

3.什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?

答:一种代码复杂度的衡量标准。在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护。

具体内容,见《软件复杂度概述》。

 

4.什么叫FullTrust?放入GAC的assembly是否是FullTrust的?

答:FullTrust即为完全信任,也称为盲目信任。

个人理解放入GAC的assembly是FullTrust的,请参看下面这段摘自《C#和.NET实战:平台、语言与框架》中关于FullTrust的描述。

CAS:FullTrust权限

我们在前面一节提到了一种名为FullTrust的特殊权限,我们也称之为盲目信任。该权限基本上允许跳过所有CAS验证。因此持有该权限的程序集能够访问所有标准及自定义权限。从CAS的角度来看,一共有两种类型的程序集:持有FullTrust权限的程序集以及没有该权限的程序集。CAS仅授权那些不具有FullTrust权限的程序集为部分信任的程序集。特别地,CAS仅授予那些带有名为Everything权限集的程序集为部分信任程序集。实际上,该权限集默认授予所有标准权限,但不包含自定义权限。

默认情况下,签名程序集的代码只能从带有FullTrust权限的程序集中调用。这条规则的原因是只有签名程序集才能放到GAC中,并且它们可以被移动代码恶意利用。实际上,未签名的程序集是无法被移动代码利用的,因为它们存储的位置是无法预测的,实现的功能也无法猜测。

CAS技术的这一特性可能会成为某种限制,但只要在签名的程序集上标以System.Security. AllowPartiallyTrustedCallersAttributes程序集attribute即可关闭这一约束。注意,大范围地发布带有该attribute的类库会给你的客户端带来更大的风险。你必须确保发布的代码不会被恶意劫持。实际上,只有微软发行的少数特殊标准程序集带有这个attribute。

最后,应当意识到,不使用该attribute并不能保证你的代码不被劫持。事实上,你的代码总是被拥有FullTrust权限的程序集调用,而该程序集是被另一个不具有FullTrust权限的程序集调用的。



 

 

5.代码加上需要安全权限的特性有什么好处?

答:可以更加灵活的设置对代码的访问权限,实现代码级保护,防止被移动代码恶意利用。

 

6.gacutil /l | find /i "Corillian" 这句命令的作用是什么?

答:全局程序集缓存中如果有Corillian就更新该程序集,没有就安装。

 

7.sn -t foo.dll 这句命令是干嘛的?

答:显示程序集foo.dll的公钥标记。

 

8.DCOM需要防火墙打开哪些端口?端口135是干嘛用的?

答:135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,135是远程过程调用(RPC)的默认端口。

 

9.XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?

       答:Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

 

10.Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
答:Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。

 

11.Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。

答:Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编

译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

 

 

12.JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?

答:方法,道理很简单,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么。
 

13.a.Equals(b)和a == b一样吗?

     答:不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等。


14.在对象比较中,对象一致和对象相等分别是指什么?

  答:对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同。


15.在.NET中如何实现深拷贝(deep copy)?

  答:deep copy即为深拷贝,要实现深老帖必须实现IClonable接口。


16.请解释一下IClonable

  答:IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone()。

 

17.特性能够放到某个方法的参数上?如果可以,这有什么用?

  答:可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo

的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。

 

 

posted @ 2010-05-19 10:06  ReadQi  阅读(729)  评论(0编辑  收藏  举报