一些面试题的回答二

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

上一篇: 对一些面试题的回答

高级开发人员/架构师



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

有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse() ,同时,还需要注意到文化区域的设置,如果做代码规范检查,该语句也会不符合规范,就是因为缺少文化区域的设置

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

PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。 默认的是同一目录,ide还可以设置全局pdb symbol文件的地址,这也是vs2008能调试.net framework source code的方法。还可以为解决方案指定pdb位置

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

不知道,望指教

4 写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查"

lock双重检查
      

5 什么叫FullTrust?放入GACassembly是否是FullTrust?

FullTrust完全信任。放入GAC中的Assembly是否FullTrust我的理解不是。我理解FullTrust是可以通过代码设定的

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

可以更加灵活的设置对代码的访问权限,实现代码级保护。?这点不是特清楚,有明白的给讲解下

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

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

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

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

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

135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定,有关内容我在http://www.cnblogs.com/jillzhang/archive/2008/02/20/1075057.html 有过一些描述。135是远程过程调用(RPC)的默认端口

10对比OOPSOA,它们的目的分别是什么?

我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而SOA是一个技术框架,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件提供给应用程序来调用,当然其组件化思想是继承和发扬了OOP的优点。

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

我只知道XmlSerializer是将对象的属性和字段进行序列化和反序列化的,序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.

12为什么不提倡catch(Exception)

原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等

13Debug.WriteTrace.Write有什么不同?何时应该使用哪一个?

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

14Debug BuildRelease Build的区别,是否会有明显的速度变化?请说明理由。

Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略

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

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

16对比抽象基类和接口的使用

抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。

17a.Equals(b)a == b一样吗?

不一样。多数情况下,a.Equals(b)表示a与b一致, a==b表示a与b的值相等 。也可以有具体重载(多谢Jeffrey Zhao 的指正)

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

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

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

实现IClonable接口

20请解释一下IClonable

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

深度复制(Deep Copy)与浅表复制(Shadow Copy)的比较

 

21什么叫装箱?

装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱

22string是值类型还是引用类型?

引用类型

23XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?

只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能。

24为什么不应该在.NET中使用out参数?它究竟好不好?

我挺喜欢用out参数的,特别是当函数需要有多于1个返回的时候,我比较愿意用out,至于它好不好没研究过 ?

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

可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。

对方法的参数设置Attribute的例子
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2008-02-29 18:26 Robin Zhang 阅读(9022) 评论(42) 编辑 收藏

 回复 引用 查看   
#1楼 2008-02-29 18:34 Jeffrey Zhao      
DateTime.Parse的主要问题其实不是抛出异常,这个是特性,问题在于它会使用当前线程的CultureInfo信息(很可能就是系统设置)的默认的格式(具体忘了),对于DateTime这种类型无论是ToString还是Parse都应该指定CultureInfo或FormatString。
cyclomatic complexity其实就是描述程序复杂度的一个度量,一般就是程序流程各种分支的数量,再具体也不清楚了。
“双重检查”写法不对
135端口,MSDTC要用
XmlSerializer是动态生成类文件再编译,所以需要写权限。
Equals和==其实含义上都不确定,因为都可以重载。
out参数的互操作性不好,不容易和别的产品/技术合作,例如很难实现跨边界out。

 回复 引用   
#2楼 2008-02-29 18:38 JustYxY[未注册用户]
不错,还没没看,不好意思站个位置先,
 回复 引用   
#3楼 2008-02-29 18:40 JustYxY[未注册用户]
By the way! 请问雄台这些题目的出处都是自己以往面试累计的麽?
 回复 引用 查看   
#4楼 2008-02-29 18:56 Tristan(Guozhijian)      
lock的写法值得商榷
 回复 引用 查看   
#5楼[楼主] 2008-02-29 19:54 jillzhang      
@Tristan(Guozhijian)
有什么问题么?

 回复 引用 查看   
#6楼[楼主] 2008-02-29 19:57 jillzhang      
out参数的互操作性不好,不容易和别的产品/技术合作,例如很难实现跨边界out。
------------------------------------------------------------
不太赞同,我用xml web service写的服务中就有out参数,客户端是asp,asp.net一样用。而且wcf中也可以用out,ref

 回复 引用 查看   
#7楼[楼主] 2008-02-29 20:04 jillzhang      
@Tristan(Guozhijian)
我写的只是lock的通常用法
如果要双重检查的话
private static object instrace ;
public static void LockTest()
{
object lockedObj = new object();
if(instrace==null)
{
lock(lockedObj)
{
if(instance==null)
{
instance = new object();
}
}
}
}

 回复 引用 查看   
#8楼[楼主] 2008-02-29 20:07 jillzhang      
XmlSerializer是动态生成类文件再编译,所以需要写权限
----------------------------------------------
它要求对temp目录有写权限

 回复 引用 查看   
#9楼[楼主] 2008-02-29 20:10 jillzhang      
135端口,MSDTC要用
MSDTC依赖于RPC,真正使用135的是RPC
http://blog.chinaunix.net/u/18156/showart_134792.html

 回复 引用 查看   
#10楼[楼主] 2008-02-29 20:11 jillzhang      
@JustYxY
我可没这么多面试经验,看网上有,挺有深度,自己理解着填的。

 回复 引用 查看   
#11楼[楼主] 2008-02-29 20:16 jillzhang      
DateTime.Parse的主要问题其实不是抛出异常,这个是特性,问题在于它会使用当前线程的CultureInfo信息(很可能就是系统设置)的默认的格式
-------------------------------------------------------
恩,这个也是一个原因,最少用DateTime.Parse(myString)的代码是不规范的,用FxCop可能会有提示

 回复 引用 查看   
#12楼 2008-02-29 21:15 Chagel      
4. you need to check the instance object equal to NULL before and after LOCK statement. It's more important to think about why we need double-check pattern and all these relations with singleton pattern.
5. GAC has nothing to do with runtime security permissions
14. I agree that it's worthy to be considered the differences bewteen == and Equals happen on the polymorphism characteristic. Topic can be expanded to value/reference equlity or identity, and attentions of using both overrides,etc.

 回复 引用   
#13楼 2008-02-29 22:22 呵呵呵[未注册用户]
仍需努力哦
 回复 引用 查看   
#14楼 2008-03-01 00:21 工业酒精      
有些问题的答案还是有问题的。

我只是在想,针对.Net的高级开发人员或者是构架师,这些题目是否就真的能够衡量其水平,我有些怀疑。

这也是工作中,实际遇到的问题,到底怎么样的题目,能考核多个方面,同时有恰如其分的深度。

 回复 引用 查看   
#15楼 2008-03-01 08:40 金色海洋(jyk)      
现在面试都靠这些了,惨了,都不会了。
 回复 引用 查看   
#16楼[楼主] 2008-03-01 08:56 jillzhang      
@工业酒精
请把有问题的指出来,这样才有意义,我说了也不是标准答案。

 回复 引用 查看   
#17楼 2008-03-01 09:22 毁于随      
高级的有一半都不会,或者没有听过,或者不确定.....
 回复 引用 查看   
#18楼 2008-03-01 10:20 Silent Void      
学习了,谢谢:)

顺便提几点:
2) Windbg中,PDB可以放在系统的%Path%环境变量下,猜想“放在和对应应用程序集相同目录。”不是一个必要条件...瞎猜的/:)

4) lock的写法不太正确,考虑如下情况:调用两次LockTest()函数,则每个函数内部都会构造一个lockObj来Lock,所以这时的Lock除了增加冗余代码外,没有任何作用。一般是定义private对象来Lock, 或Lock一个private static对象变量来保护所有实例所共有的数据;

6) 猜想是在方法上应用权限相关的Attribute...瞎猜的/:)

14) Release相比Debug,做了更多的优化以提高运行性能。举一个例子:在一个方法执行到一半代码这个时间点上,GC应该可以检测到前半部分代码中构造的部分对象没有用了,但在Debug模式下,它不会回收这些对象,而在Release模式下,它可能会回收这些对象。这只是一个例子,应该还有很多其他的优化,如冗余代码、循环优化等,毕业出来半年,编译原理都都忘光了...汗...

16) 引用.net框架书中的说法:类继承基类表达的是一种“IS-A”的关系,而类继承接口表达的是一种“Can-Do”的约束。另外,正是“抽象类能有具体实现,而接口只定义行为规范,不能有具体实现”,则子类在继承基类时,可以继承并重用基类的实现,这样做的好处是减轻构造子类的负担,带来的副作用是增加了父类和子类的耦合。

17) 要看a的类型定义中,有没有重写Equals方法和重载==操作符。

 回复 引用 查看   
#19楼[楼主] 2008-03-01 10:37 jillzhang      
2) Windbg中,PDB可以放在系统的%Path%环境变量下,猜想“放在和对应应用程序集相同目录。”不是一个必要条件...瞎猜的/:)

-------------------------------------------------
默认的是同一目录,ide还可以设置全局pdb symbol文件的地址,这也是vs2008能调试.net framework source code的方法。还可以解决方案指定pdb位置

 回复 引用 查看   
#20楼[楼主] 2008-03-01 10:39 jillzhang      
4) lock的写法不太正确,考虑如下情况:调用两次LockTest()函数,则每个函数内部都会构造一个lockObj来Lock,所以这时的Lock除了增加冗余代码外,没有任何作用。一般是定义private对象来Lock, 或Lock一个private static对象变量来保护所有实例所共有的数据;
-----------------------
我的确写错了

 回复 引用 查看   
#21楼[楼主] 2008-03-01 10:44 jillzhang      
17) 要看a的类型定义中,有没有重写Equals方法和重载==操作符。
-----------------------------------------------------------
重写的应该不在这道题的考察范围之内,要不就没有绝对答案了。你给个应该根据重写来判断等于没说,因为任何问题你都可以这样回答,大不了可以用一个同名函数覆盖,这里肯定初衷是强调Equal是判断引用相同,而==是值相等,也就是string.Equals() 与 "1"=="1" 的区别

流程挺全的

 回复 引用 查看   
#23楼 2008-03-01 11:34 Silent Void      
@jillzhang
有时面试官问的问题本身就比较模糊,可能问之前也没有仔细斟酌;但也正好留给面试者发挥的空间:)

 回复 引用 查看   
#24楼 2008-03-01 14:42 Jeffrey Zhao      
@jillzhang
如果我是面试别人,如果不提Equals和==是可以重载的,这题一半已经错了。
还有就是,Equals和==并没有说Equals判断引用相等,==判断值相等。判断引用相等,唯一正确的做法只有调用Object.ReferenceEquals。
就拿你举的String类来说,我把它的==和Equals的代码贴出来:

public static bool operator ==(string a, string b)
{
    return Equals(a, b);
}

public static bool Equals(string a, string b)
{
    return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}

// =================================

public bool Equals(string value)
{
    if ((value == null) && (this != null))
    {
        return false;
    }
    return EqualsHelper(this, value);
}

很明显,它们最终都是调用EqualsHelper方法来判断,两个方法的判断依据是一样的。

关于一个object的Equels和==的含义如何,在一个合理的类中应该如何重载,还是推荐一本书:《CLR via C#》,呵呵。


 回复 引用 查看   
#25楼[楼主] 2008-03-01 15:03 jillzhang      
http://www.javanb.com/java/2/19522.html
可以看看这个吧
在多数情况下这两者的区别就是究竟是对对象的引用进行比较还是对对象的值进行
比较(其他特殊情况此处不予考虑)。

当然他也提到了有重载的问题。重载只不过是一个角度,那值,引用应该也是
我的理解是这样的,如果二者没有严格的界定,clr怎么会不厌其烦的制造着相同作用的函数和操作符呢?还有上文所说的Dispose与Close其实还是有区别的。

我想更详细的答案只能是上面那个详细的文章吧。至于打多少分的问题,我也不赞同你的看法,如果是我,我觉得在笔试上,我觉得我会对我的答案打90或者满分。因为关注的范围不一样而已,如果真要面面俱到的话,估计你一个合格的都招不到了。当然我只是说如果是我作为评分者的情况下,我的想法。但站在这篇帖子的角度,对你的补充深表感谢。这两篇面试题的回答,给我也带来了不少知识。

 回复 引用 查看   
#26楼 2008-03-01 15:09 Jeffrey Zhao      
@jillzhang
怎么用Java来理解.NET了呢?而且Java里也是Equals代表值相等,==代表引用相等,和你描述的正好相反,呵呵。
关于这个问题,我去查查看哪里有设计初衷的描述。这个问题也只能从设计初衷和合理设计的方面来判断了,CLR本身倒只是老老实实地实现,重载就按照重载执行了。

 回复 引用 查看   
#27楼[楼主] 2008-03-01 15:15 jillzhang      
@Jeffrey Zhao
恩,你的说法是正确的。那关于二者的区别,如果是你的话,你如何作答?

 回复 引用 查看   
#28楼[楼主] 2008-03-01 15:17 jillzhang      
@Jeffrey Zhao
对了,那本CLR via C#的书我已经从china-pub上订购了,有时间一定看看

 回复 引用 查看   
#29楼 2008-03-01 15:20 Jeffrey Zhao      
@jillzhang
我有空查一下资料再说。:)

 回复 引用 查看   
#30楼[楼主] 2008-03-01 15:23 jillzhang      
@Jeffrey Zhao
好。
还有对其他的问题,也麻烦你都进一步的核实一下我的说法。
现在我发现原来有好多误区,重要的是别误导大家。

 回复 引用 查看   
#31楼 2008-03-01 15:31 tianhu      
感谢,长见识了。这些很多问题在脑袋里面感觉是知道,可是就是不够明确。现在好些了哦

 回复 引用 查看   
#32楼 2008-03-01 15:33 Jeffrey Zhao      
http://msdn2.microsoft.com/en-us/library/7h9bszxx(VS.71).aspx
看来如果设计合理,一个类的Equals和==的含义是一样的。
文章也提到了对于Value Type和Reference Type要区别对待——看来面试题的关键应该在这里。

 回复 引用 查看   
#33楼 2008-03-02 11:54 JackMa      
我怎么觉得之前的中级题目更难?!
 回复 引用   
#34楼 2008-03-03 09:25 look look[未注册用户]
路过 学习!长见识了!谢谢 辛苦了!
 回复 引用 查看   
#35楼 2008-03-04 11:32 高海东      
不错
 回复 引用 查看   
#36楼 2008-03-06 11:23 高海东      
学习
 回复 引用 查看   
#37楼 2008-03-06 11:42 尕豆      
只有学习的份了
 回复 引用   
#38楼 2008-03-13 07:36 ff[未注册用户]
@高海东
--引用--------------------------------------------------
高海东: 学习
--------------------------------------------------------
@尕豆
@look look
dfdfd

 回复 引用   
#39楼 2008-08-06 16:36 盖盖宝宝[未注册用户]
感觉有点卖弄的!
 回复 引用 查看   
#40楼 2008-08-22 12:21 sharping      
不知不觉逛到这里,有点意思,呵呵,但是个人任务有几个问题值得商榷:
文中:而拆箱(unboxing)是将饮用类型数据转换值类型,比如int j = (int)o;属于拆箱
我认为这个似乎不对,MSDN上有具体描述,的托管堆中查找一个已装箱对象的地址,然后获取一个已装箱对象中属于值类型对象(未装箱前)的那部分字段地址,这个过程就叫拆箱(注意尚未完成值拷贝)。将拆箱过程中找到的属于值类型对象的字段拷贝到线程堆栈上的值类型对象这个过程并不是拆箱过程的一部分,所以将引用类型数据转换值类型还包含了非拆箱操作,笼统的说法值得商榷。

问题:为什么不提倡catch(Exception)?
这个不是什么性能问题,问题应该是为什么要具体异常具体捕获,个人认为是catch(Exception)会隐含了一些我们无法处理的异常,例如CLR本身的异常,比如StackOverflowException,这种异常是根本无法处理的,必须关闭应用程序,而catch(Exception)可能会隐藏掉这种异常,catch捕获的异常应该是预期的,而不是捕获所有的异常。

问题:请解释一下IClonable
个人认为这个接口只是标识对象是否可以被克隆,而MSDN中也并没有说明他应该实现一个深拷贝或者一个浅拷贝,事实上微软在实现这个接口时候常常都是浅拷贝。

问题:特性能够放到某个方法的参数上?如果可以,这有什么用?
有什么用?我认为答案很简单增加PE文件方法表方法参数的元数据属性,至于这个语句MethodInfo.GetCurrentMethod().GetParameters()[0];我没测试过内联调用是否还正确,估计是从堆栈上获取方法元数据,那么内联时候很可能会获得错误的MethodInfo。

呵呵,权当讨论,不妥之处望指教

 回复 引用 查看   
#41楼 2008-08-22 12:33 sharping      
另外:

out问题,个人认为out和ref区别在于out允许不赋值使用,是否是因为容易产生空引用异常(纯属瞎猜),我个人不太理解题目的真正意思。。。