C#常见问题

1  Thread和Process之间有什么区别?.NET新引入了Application Domain的概念,这样他们三个之间有什么区别?引入了Application Domain会带来一些潜在的问题么?
进程可以理解为一个容器,提供进程空间,线程所使用的内存都在进程空间中分配。每个线程有自己的堆栈。APPDomain相当于一个逻辑概念,相当于在进程中逻辑的划分了一些区域,所以线程是可以跨域访问另外的线程。

2  Windows Service与普通的EXE在执行过程中有什么区别?
一般前者无界面,有windows的Service服务器负责维护启动和关闭。Exe由用户维护且一般有界面。

3  一个进程可以访问的Windows地址空间有多大?等于系统的虚拟内存大小么?这两方面将对系统的设计产生什么样的影响?
a.跟数据总线有关系。一般32位操作系统,寻址空间可以达到4GB,所以一个进程可以访问的地址也为4GB(不过实际上,有2GB是留给操作系统使用的,4M是不可访问的,剩下的空间才供进程使用)。
b.不等于虚拟内存。
c.寻址空间和数据总线的宽度有关系。虚拟内存会消耗CPU处理时间。因为需要做内外存的转换工作。

4  EXE和DLL之间的区别是什么?在系统设计中应该如何选择使用它们?
a..Exe有自己的进程空间,dll没有,dll只能被引用后,和exe共享进程空间才能被调用和运行(其实还有rundll32命令可以启动dll,该系统命令本质上就是为其提供进程空间)。
b.dll也叫动态链接库,可以将反复使用的共有代码和资源放在动态链接库中,这样在内存中只会有一个副本,节约内存空间(不同的进程根据不同的重定位信息可以定位到制定的dll中)。

5  普通的EXE与.NET EXE的执行过程有什么不同?
普通exe可以直接在操作系统上执行,但是.net exe需要jit的及时编译,并在托管环境下(即CLR的控制下)运行

6  什么是弱类型,什么是强类型?在系统设计中应该首先考虑使用哪种类型?
弱类型在一定程度上允许不同类型的数据进行相互操作和运算,但是强类型不允许,因为强类型会做类型检查工作。

7  PDB文件是作什么用的?里面包含了什么信息?
程序数据库 (PDB) 文件保存着调试和项目状态信息,使用这些信息可以对程序的调试配置进行增量链接。

8  Cyclomatic Complexity是什么?为什么它很重要?
圈复杂度,用于衡量程序的分支数量。一个正常的方法,分值应该控制在5,6个,如果分支数太大,则最好进行方法的分解,避免badsmell.

9  为创建一个critical section以访问某个变量书写一个标准的lock() 并加上double check。
If(m_Instance!=null)
{
      lock(this)
      {
              if(m_Instance!=null))
              {
                    //do something
              }
      }
}

10  为某个对象实现标准的Dispose模式。
Class MyObject:Idisposable
{
      public void Dispose()
      {
              //do something
      }
}
就是实现Idisposable接口,进而实现自定的析构

11  什么是FullTrust? 存在于GAC中的 assembly 拥有FullTrust么?
    不知道

12  下面这个命令是做什么的?gacutil /l | find /i “system”
全局程序集缓存工具使您可以查看和操作全局程序集缓存和下载缓存的内容。

13  下面这个命令是作什么的? sn -t something.dll
Sn.exe 提供用于密钥管理、签名生成和签名验证的选项。

14  跨防火墙的 DCOM必须打开哪个端口?端口135是用来做什么的?

15  有什么办法可以与现有unmanaged code集成?在集成的时候应该考虑什么问题?

16  简要解释一下OOP与SOA都是用来作什么的?
OOP是一种程序编程架构,包含几个特征:组件,封装,继承,抽象,多态。
SOA叫面向服务架构。

17  XmlSerializer是如何工作的?进程运行XmlSerializer时候需要什么样的ACL权限?
ACL访问控制列表。

18  在系统设计时,何时应该使用try catch?何时需要避免使用?

19  Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?
都是断言。Debug.Write()为调试版本,在发行版本里面不会被执行,而Trace.Write在发行版本中会被执行。

20  Debug Build和Release Build有什么区别?在执行效率上有什么明显的区别么?
Debug build的版本包含了一些调试信息,执行效率会低一些。

21  JIT是针对Assembly还是Method发生的?解释一下为什么.NET的设计者要这样做?

22  简要描述一下GC的执行过程。
当内存减少到某个程度之后,CLR启动垃圾回收,将那些不被引用的对象回收并释放所占用的内存。

23  应该如何选择使用abstract class还是interface?
抽象类可以有实现,接口无实现。接口可以多继承,抽象类不行。

24  在设计一个自定义类型时应如何选择使用Value Type还是Reference Type?
其实要描述的就是引用类型和值类型的区别。可以从内存分布和访问效率两方面谈。

25  对于Value Type和Reference Type,a.Equals(b)的默认实现方式有什么不同?
值类型默认就是指是否相等。引用类型就是比较两个引用是否指向同一个对象。

26  .NET中为什么不提供默认的deep copy?如果需要,要如何实现deep copy?
因为深度拷贝涉及到拷贝的级数问题,就是需要深度拷贝到什么层次。在C#中,不可以直接覆写MemberwiseClone方法,可以实现Iclone接口来实现自定义的深度拷贝。

27  相对于.NET 1.1,.NET2.0为了避免过度的boxing/unboxing造成的系统开销提供了哪些支持?
范型。

28  String是Value Type还是Reference Type?为什么.NET中的String对象被设置成immutable?
是引用类型。因为字符串对象在操作系统中出现的频率很高,如果为每一个string都分配一个独立的内存,将会是很大的系统开销。所以string 设置为不可变的,就是一种内存驻留技术,本质上就是让同样的字符串都访问同一块内存。比如:s1=”a”,s2=”b”,则s1和s2其实都是指向同一块 为”a”的内存;如果现在修改s1=”b”,则s1将不再指向”a”,而是开辟另一块为”b”的内存空间,使s1指向b(其实如果有另一个s3=”b”, 则s1就会和s3指向同一个”b”,此时s1不再重新开辟空间)。
posted @ 2009-02-12 16:45  TONYBINLJ  阅读(430)  评论(0编辑  收藏  举报