1.DateTime.Parse(myString); 这行代码有什么问题?
2.PDB是什么东西? 在调试中它应该放在哪里?
3.什么叫圈复杂度(cyclomatic complexity)?为什么它很重要?
4.写一个标准的lock(),在访问变量的前后创建临界区,要有"双重检查",
5.什么叫FullTrust?放入GAC的assembly是否是FullTrust的?
6.代码加上需要安全权限的特性有什么好处?
7.gacutil /l | find /i "Corillian" 这句命令的作用是什么?
8.sn -t foo.dll 这句命令是干嘛的?
9.DCOM需要防火墙打开哪些端口?端口135是干嘛用的?
10.对比OOP和SOA,它们的目的分别是什么?
11.XmlSerializer是如何工作的?使用这个类的进程需要什么ACL权限?
12.为什么不提倡catch(Exception)?
13.Debug.Write和Trace.Write有什么不同?何时应该使用哪一个?
14.Debug Build和Release Build的区别,是否会有明显的速度变化?请说明理由。
15.JIT是以assembly为单位发生还是以方法为单位发生?这对于工作区有何影响?
16.对比抽象基类和接口的使用
17.a.Equals(b)和a == b一样吗?
18.在对象比较中,对象一致和对象相等分别是指什么?
19.在.NET中如何实现深拷贝(deep copy)?
20.请解释一下IClonable
21.什么叫装箱?
22.string是值类型还是引用类型?
23.XmlSerializer使用的针对属性的模式有什么好处?解决了什么问题?
24.为什么不应该在.NET中使用out参数?它究竟好不好?
25.特性能够放到某个方法的参数上?如果可以,这有什么用?
26.新建包含DataGrid控件的ASP.NET页,DataGrid控件负责显示检索到的数据并可按升降排序,我们通过 SortOrder 属性来给DataGrid控件提供数据排序方式:升序时SortOrder 的值为ASC,降序时SortOrder 的值为DESC。如果用户选择降序,应该执行
a)Application[“SortOrder”] = “DESC”;
string val = (string) Application[“SortOrder”];
b)Cache[“SortOrder”] = “DESC”;
string val = (string) Cache[“SortOrder”];
c)ViewState[“SortOrder”] = “DESC”;
string SortOrder = (string) ViewState[“SortOrder”];
d)Cache[“SortOrder”] = “SortOrder”;
string val = (string) Cache[“DESC”];
27.public static void Main(string[] args)
{
int i = 2000;
object o = i;
i = 2001;
int j =(int) o;
Console.WriteLine("i={0},o={1}, j={2}",i,o,j);
}
请问此程序的输出是什么,为什么
28.class Class1
{
public static int Count = 0;
static Class1()
{
Count++;
}
public Class1()
{
Count++;
}
static void Main()
{
Class1 o1 = new Class1();
Class1 o2 = new Class1();
Console.WriteLine(Class1.Count);
Console.Read();
}
}
输出什么?
29.以下语句执行后myTable的名称是什么?。
System.Data.DataTable myTable= new System.Data.DataTable();
30.如下的 IDimensions 接口和Box 类,该类显式实现接口成员 Length 和 Width。myDimensions是IDimensions 接口的一个实例。
interface IDimensions
{
float Length();
float Width();
}
class Box : IDimensions
{
float lengthInches;
float widthInches;
public Box(float length, float width)
{
lengthInches = length;
widthInches = width;
}
float IDimensions.Length()
{
return lengthInches;
}
float IDimensions.Width()
{
return widthInches;
}
public static void Main()
{
Box myBox = new Box(30.0f, 20.0f);
IDimensions myDimensions = (IDimensions) myBox;
System.Console.WriteLine("Length: {0}", myBox.Length());
System.Console.WriteLine("Width: {0}", myBox.Width());
}
}
执行以上程序控制台输出为?
答案:
1.当myString不能满足时间格式要求的时候,会引发异常。建议使用DateTime.TryParse()
2.PDB是用于保存调试和项目状态信息的文件,在debug的时候将产生pdb文件,调试的时候应该放在和对应应用程序集相同目录。
3.一种代码复杂度的衡量标准, 英文名称叫Cyclomatic Complexity。在软件测试的概念里,圈复杂度“用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系”。
4.
1public void LockTest()
2{
3 Object lockObj = new Object();
4 lock (lockObj)
5 {
6 //
7 }
8}
5.FullTrust完全信任。.NET运行时对GAC中的assembly自动赋予Full Trust的权限.
6.没深入过,望高手指教
7.全局程序集缓存中如果有Corillian就更新该程序集,没有就安装
8.显示程序集foo.dll的公钥标记
9.135端口,因为DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。因为根本不晓得开哪个端口。但有解决办法可以使DCOM分配的端口号固定。135是远程过程调用(RPC)的默认端口
10.我想OOP和SOA应该没有对比性吧。OOP是一种编程模型,强调将复杂的逻辑分解出小的模块,特性是继承,封装和多态 。而SOA是一个技术框架或者是一种思想,技术框架和编程模型应该说不是一码事吧?SOA的思想是将业务逻辑封装成服务或者中间件现组成业务总线提供给应用程序来调用。
11.将对象序列化成为xml数据,反序列化再将xml转换成对象。应该至少需要ACL权限中的读权限.
12.原因可能有两点:1)try..catch在出现异常的时候影响性能 2)应该捕获更具体得异常,比如IOExeception,OutOfMemoryException等
13.Debug.Write是调试的时候向跟踪窗口输出信息。当编译模式为debug的时候才有效,为release的时候Debug.Write在编译的时候会忽略,而Trace则是在debug和release两种模式下均可以向跟踪窗口输出信息。
14.Debug会产生pdb文件,release不会。Debug用于开发时的调试,不能要于部署,而release用于部署.debug编译一些特殊代码,比如#IFDEBUG Debug.Write等,而Release则会将那些特殊标记省略
15.方法,因为对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用,此时CLR傻乎乎的给整个程序集都给Compile了,CLR不是傻疯了么
16.抽象类能有具体实现,而接口只定义行为规范,不能有具体实现。一个类只能继承一个父类,但能实现多个接口。
17.不一样。a.Equals(b)表示a与b一致, a==b表示a与b的值相等
18.对象一致是指两个对象是同一个对象,引用相同。而对象相等是指两个对象的值相同,但引用不一定相同
19.实现IClonable接口
20.IClonable方法是实现深度复制的接口,实现它应该能深度复制一个对象出来。深度复制的特征的调用对象的构造方法,创建新的对象,包括创建对象中嵌套的引用对象的新实例。而Shadow复制则不同,是浅表复制,不重新创建新实例。浅表复制的实现是Object.MemberWiseClone().
深度复制与浅度复制比较
1 public class Name
2 {
3 public string FirstName;
4 public string LastName;
5 }
6 public class Person:ICloneable
7 {
8 public Name PersonName;
9 public string Email;
10 /**//**//**//// <summary>
11 /// Deep Copy的例子
12 /// </summary>
13 /// <returns></returns>
14 public Object Clone()
15 {
16 Person p = new Person();
17 p.Email = this.Email;
18 p.PersonName = new Name();
19 p.PersonName.FirstName = this.PersonName.FirstName;
20 p.PersonName.LastName = this.PersonName.LastName;
21 return p;
22 }
23
24 public void ChangLastName(string lastName)
25 {
26 this.PersonName.LastName = lastName;
27 }
28
29 public static void Main()
30 {
31 Person p = new Person();
32 p.PersonName = new Name();
33 p.PersonName.LastName = "jill";
34 p.PersonName.FirstName = "zhang";
35 p.Email = "jillzhang@126.com";
36 Person sameNamePerson = p.Clone() as Person;
37 sameNamePerson.ChangLastName("clr_");
38 Console.WriteLine(p.PersonName.LastName);
39 Console.WriteLine(sameNamePerson.PersonName.LastName);
40
41
42 Person samePerson = p.MemberwiseClone() as Person;
43 samePerson.ChangLastName("Shadow");
44
45 Console.WriteLine(p.PersonName.LastName);
46 Console.WriteLine(sameNamePerson.PersonName.LastName);
47
48 Console.Read();
49 }
50 }
21.装箱(boxing)是将值类型的数据转化成引用类型,int i=3; object o = i ;便是装箱过程,而拆箱(unboxing)是将引用类型数据转换值类型,比如int j = (int)o;属于拆箱
22.引用类型
23.只序列化有用的数据,而不是序列化整个对象。实现没必要的数据冗余,和提升序列化时的性能
24.不知道,只是看过有文章说最好少用……
25.可以,作用可以对参数有进一步限定,比如输入参数为int类型,可以通过允许AttributeTargets=ParameterInfo的Attribute自定义实现来限定输入参数的大小,比如当输入参数小于100的时候便抱错。
方法的参数设置Attribute的例子
1 [AttributeUsage(AttributeTargets.Parameter)]
2 public class ParameterAtt : Attribute
3 {
4 public int Min = 100;
5 }
6
7 public class AttributeTest
8 {
9 public void TestMethod([ParameterAtt(Min = 100)] int par1)
10 {
11 ParameterInfo para = MethodInfo.GetCurrentMethod().GetParameters()[0];
12 ParameterAtt att = ParameterAtt.GetCustomAttribute(para, typeof(ParameterAtt)) as ParameterAtt;
13 if (att.Min > par1)
14 {
15 throw new Exception("要求para1最小为" + att.Min);
16 }
17 }
18 }
26.C
27.i=2001,0=2000,j=2000
28.3
29.""(字符串空)
30.报错,Box 类并没有Length和Width方法
|