首页 > 学院 > 开发设计 > 正文

C#基础回顾

2019-11-17 03:19:47
字体:
来源:转载
供稿:网友

C#基础回顾

  1. 进程和线程之间的区别?

    一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。

    这个解释很形象:http://www.VEVb.com/laozhao8/p/3574737.html

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

    Windows服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。

    EXE 可执行程序通常有一个用户界面,Console或 GUI,通常由用户来启动或停止。

  3. Windows单进程可寻址的最大内存是多少? 他们如何影响系统应用软件设计?

    以32位操作系统为例,最大寻址是4G(含虚拟内存),是通过2的32次方计算的; 当物理内存小于4G时,进程访问的内存量随着虚拟内存的增加而增加,直到4G; 4GB内存实际上包含了程序的所有部分--包括可执行代码,代码加载的所有dll,以及程序运行时使用的所有变量的内容。这个4GB内存称为虚拟地址空间,或虚拟内存。

    对设计有明显影响的有2点:

    在.NET中区别最明显的是int的使用,在32位下和64位下存储的数据不一样(int 4个字节32位, 8个字节64位);另外一个是编译的程序为X86则可在32、64位下同时运行。

  4. EXE 和DLL之间的区别?

    DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。EXE就不用说了吧~

  5. 强类型和弱类型的区别,以及其优缺点?

    强类型是指尽量早的检查变量的类型, 通常在编译的时候就检查.

    弱类型是指尽量推后对变量类型的检查, 通常在运行时检查。

    到底哪个好? 其实各有各的好, 像ruby, javascript, 都属于week-typing, 好处是写代码的时候比较快. C#属于strong-typing, 好处是如果变量类型不对的话, 编译不会通过, Visual Studio 还会有提示. 至于写代码的速度上讲, 自从C# 3.0以来, 使用var来定义变量, 简单了很多。

  6. 什么是PID, 在解决系统问题时有用吗?

    PID全称是 PRocess Identifier, 就是进程的一个号码, 通常当系统哪个程序不听使唤的时候, 可以用它来把这个程序关闭. 而且Debug的时候, 也有用。

  7. 一个TCP/IP端口可以被多少个进程分享?

    TCP/IP端口可以被多少个进程分享

    1 Socket socket1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);2 Socket socket2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);3 socket1.Bind(new IPEndPoint(IPAddress.Parse(”127.0.0.1″),8235));4 socket1.Listen(10);5 socket2.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);6 socket2.Bind(new IPEndPoint(IPAddress.Parse(”127.0.0.1″), 8235));7 socket2.Listen(10);8 Console.Read();
  8. 什么是 GAC?使用 GAC 给我们带来哪些好处?

    GAC 是指 Global Assembly Cache, 用处是放在这里的程序集可以被多个程序共同调用, .NET 中的大部分程序集都在这里. 解决的问题是节省硬盘空间以及防止Dll Hell。

  9. 面向接口、面向对象和面向方面编程的区别

    面向接口:定义要实现某类功能应该遵循的统一规范,而具体实现过程由实现该接口的类型决定。

    面向对象:强调对具有相同行为和属性事物的封装,更注重封装的完整性和功能的完整性。

    面向方面:主要提供与业务逻辑无关的操作。比如系统中有多个地方都用到文件上传功能,可以使用面向方面的思想在所有上传文件之前对文件的大小、格式等信息进行过滤操作,而不是在每处上传代码里面完成对这些信息的过滤。

  10. 接口和类的区别?

    接口(Interface): 不能实列化,自己没有状态,方法也没有具体的实现,被继承时,继承类需要实现接口的所有方法。接口就像租房时网上下载的一个租房合同模板

    类 (Class): 可以被实例化,有状态,被继承时,继承类也不需要重新实现被继承类中的方法。但是如果被继承类的方法中有abstract修饰的,继承类则需要实现这个方法。类像是已经被填上内容的租房合同的模板。

  11. 什么是反射?

    代码在运行过程中动态获取程序集的信息,对象的信息,或者直接调用对象的方法或属性。 e.g. var i = 100; i.GetType(); 输出System.Int32。

  12. xml web service 跟 .NET Remoting 的不同。

    XML Web service: 是开放标准,使用Http/SOAP协议交互。 .NET Remoting: 是微软自己的技术,只能在.NET里面使用。

  13. early-binding 和late-binding 的区别是什么?

    early-binding: 是指编译的时候绑定,late-binding是指运行时绑定。

  14. Assembly.Load是静态引用还是动态引用?

    动态引用。

  15. Assembly.LoadFrom和Assembly.LoadFile,2者使用的时机有何不同?

    Assembly.LoadFile只载入相应的dll文件,其他文件并不会被载入。

    Assembly.LoadFrom会载入dll文件及其引用的其他dll

  16. 什么是Assembly Qualified Name? 一个文件名吗? 有何不同?

    这里问的是强名称概念。

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

  17. Assembly.Load("foo.dll")加载程序集的方法是否正确?

    不对,正确方式为:Assembly.Load("foo, Version=1.0.2004.0, Culture=neutral, PublicKeyToken=8744b20f8da049e3")

  18. 强签名的程序集与非强签名的程序集有何不同?

    通过签发具有强签名的程序集合,可以确保名称的全局唯一性!因为强名称是依赖于唯一的密钥对来确保名称的唯一性,其他人不会生成与你相同的程序集名称(不同的私钥产生的名称不同)。强名称保护程序集的版本沿袭,因为强名称的唯一性能够确保没有其他人能够生成你的程序集的后续版本。强名称提供可靠的完整性检查,通过.NET Framework安全检查后,可以确保程序集内容在生成后未被更改过!

  19. DateTime 可以为null吗?

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

  20. 什么是 JIT?什么是 NGEN?分别的优势和劣势是什么?

    JIT(Just In Time),这是我们通过.NET编译器生成的应用程序最终面向机器的编译器

    本机映像生成器 (Ngen) 是一种提高托管应用程序性能的工具。 Ngen.exe 创建本机映像(包含经编译的特定于处理器的机器代码的文件),并将它们安装到本地计算机上的本机映像缓存中。运行时可从缓存中使用本机映像,而不必使用实时 (JIT) 编译器编译原始程序集。

    由于 JIT 编译器会在调用程序集中定义的单个方法时将该程序集的 MSIL 转换为本机代码,因而必定会对运行时的性能造成影响。在大多数情况下,这种性能影响是可以接受的。更为重要的是,由 JIT 编译器生成的代码会绑定到触发编译的进程上。它无法在多个进程之间进行共享。为了能在多个应用程序调用或共享一组程序集的多个进程之间共享生成的代码,公共语言运行库支持一种提前编译模式。此提前编译模式使用本机映像生成器 (Ngen.exe) 将 MSIL 程序集转换为本机代码,其作用与 JIT 编译器极为相似。但是,Ngen.exe 的操作与 JIT 编译器的操作有三点不同:

    · 它在应用程序运行之前而不是运行过程中执行从 MSIL 到本机代码的转换。

    · 它一次编译一个完整的程序集,而不是一次编译一个方法。

    · 它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。

  21. 如何在.NET CLR的分代垃圾收集器管理对象的生命周期?什么是不确定性的终结?

    .NET的垃圾回收分为3代,可通过GC.Collect强制处理。

    一个对象实例没有被任何地方引用时就称为垃圾,当内存不够是GC就会将该对象实例占用的空间清理出来

  22. Finalize()和Dispose()的区别?

    Finalize只释放非托管资源;

    Dispose释放托管和非托管资源

    Finalize和Dispose共享相同的资源释放策略,因此他们之间也是没有冲突的。

  23. Using()模式有用吗? IDisposable是什么? 它如何支持确定性的终结?

    有用,限定资源作用域并自动释放。

    IDisposable是一个接口,有一个方法Dispose(),可以在对象出作用域的时候调用,如在Using出界后调用这个接口。

  24. tasklist /m "mscor*" 命令行的作用是?

    列出所有使用符合引号内pattern的dll的进程.

  25. in-proc 和 out-of-proc 之间的区别是什么?

    In-proc 发生在一个进程之内, Out-of-proc 发生在不同进程之间。

  26. out-of-proc是基于什么技术实现的?

    .NET remoting

  27. 当你在asp.net中运行一个组件时,它在Windows xp, Windows 2000, Windows 2003上分别跑在哪个进程里面?

    Xp : aspnet_Wp.exe

    Windows 2000 : inetinfo.exe

    Windows 2003 : w3wp.exe

  28. DateTime.Parse(myString)是否正确?

    一般使用DateTime.TryParse解析。

  29. PDBs是什么? 什么场景下为了调试需要加载它?

    PDBs是源码编译文件-全称Program Database,这个文件主要会存储对应模块(dll或者exe)内部的所有符号,以及符号对应的地址、文件名和行号。调试的时候应用程序和源文件之间的一个桥梁。

  30. 什么是圈复杂度,以及为什么它很重要?

    一种代码复杂度的衡量标准。

    可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的潜在风险和高的圈复杂度有着很大关系。

  31. 写一个标准的 lock() 编码方法,以及 “双重检查”代码

    lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区。 如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。

     1 public class MySingleton { 2  3 private static object myLock = new object(); 4  5 private static volatile MySingleton mySingleton = null; 6  7 private MySingleton() { 8  9 }10 11 public static MySingleton GetInstance() {12 13 if (mySingleton == null) { //第一次检查14 15 lock (myLock) {16 17 if (mySingleton == null) { // 第二次检查18 19 mySingleton = new MySingleton();20 21 }22 23 }24 25 }26 27 return mySingleton;28 29 }30 31 }
  32. 什么是FullTrust? GAC下的程序集拥有FullTrust吗?

    FullTrust即为完全信任,也称为盲目信任.

    GAC:有FullTrust权限

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

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

  34. gacutil /l | find /i "Corillian" 作用是?

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

  35. 这行命令的功能sn -t foo.dll

    显示程序集的公钥标记。

  36. DCOM穿过防火墙,哪些端口需要打开? 135端口的目的是什么?

    因DCOM的端口号是随机分配的,默认情况下,会分配1024以上的端口号,所以默认情况下,DCOM不能穿越防火墙。

    135是远程过程调用(RPC)的默认端口

  37. 对比OOP和SOA。各有什么原则?

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

  38. XmlSerializer工作原理是什么?当进程使用它时需要什么ACL权限?

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

  39. 为何catch(Exception)的使用通常都不是一个好办法?

    因为try-catch有性能损失,在性能要求高的场景下,频繁使用效果很差。同时,catch(Exception)后,可能会破坏程序的正常执行逻辑,导致阅读、调试代码难度增大。

    Catch的时候应该捕捉具体的Exception类型,而不是通用的Exception

  40. Debug.Write 和 Trace.Write 的区别是什么? 应在什么时候使用它们?

    Debug只在debug状态下会输出,Trace在release下也会输出,在release下Debug的内容会消失。Debug会产生pdb文件,release不会。

  41. Debug和Release编译有何不同? 对于程序运行速度而言是否有明显区别?为什么用,或为什么不用它?

    Debug和Release编译产出物不一样,Release下无调试信息,如Assert无法使用。对程序运行速度而言,无明显区别。建议在开发环境下用Debug编译,发布环境下用Release,为了使用Assert断言。

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

    方法,因对于一次运行,很可能只用到一个程序集中极少数类型和对象,而大部分可能并不会被使用。

  43. 抽象基类(abstract base class)和接口(interface)对比

    接口(Interface)是用来定义行为规范的,不会有具体实现,而抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个基类。接口是是一种契约,定义了继承它的类必须声明接口中的方法。

    区别:

    接口只有方法、属性、事件和索引符;类除了这四种成员之外还可以别的成员(如字段)。接口没有构造函数,类有构造函数。

    接口不能进行运算符的重载,类可以进行运算符重载。

    接口的成员没有任何修饰符,其成员总是公共的,而类的成员则可以有修饰符。派生于接口的类必须实现接口中所有成员的执行方式,而从类派生的则不然。

  44. a.Equals(b) 与 a == b 的区别?

    equals:比较两个变量的内容是否相等

    ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。

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

    对象一致指的是引用相同。对象相等指的是内容相等。

  46. 如何实现.NET中的深复制操作?

    深复制将会在新对象中创建引用类型字段引用的所有对象,改变新对象中引用的任何对象,不会影响到原来的对象中对应字段的内容。

  47. 对IClonable接口的理解应为?

    ICloneable 接口可以提供创建现有对象中复制的自定义实现。

  48. 什么是拆箱和装箱操作?

    拆箱就是引用类型转换为值类型,通常伴随着从堆中复制对象实例的操作

    装箱就是值类型数据转换为Object类型的引用对象

  49. string 是值类型还是引用类型?

    引用类型

  50. XmlSerializer所使用的“PropertySpecified”模式的意义是什么?它试图要解决什么问题?

    把不参与序列化的对象标注出来,只序列化有用的数据,而不是序列化整个对象。去除没必要的数据冗余,和提升序列化时

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表