background image

集, throw ex 会清空之前收集的 stack trace 的信息, 相当于抛出了一个新的异常, 而 throw 不会, 所以 throw ex 不利于找

出问题所在.

不同的 layer 应该 catch 不同 exception, 最上层处理最 general 的 exception, 底层去处理一些 detail 的 exception.

List<T>和 T[]的区别是什么,平时你如何进行选择?Dictionary<TKey, TValue>是做

什么的?.NET BCL 中还有哪些常用的容器?它们分别是如何实现的(哪种数据结构)?
分别是适用于哪些场景?

T[] 继承自 Array, 而 List<T>仅仅是对 T[]的封装; 相比于 T[], List<T>的 size 是动态变化的.

Dictionary<TKey, TValue>可以用来存储键/值对.其他的比如 HashTable, SortedList 等.

抽象类和接口有什么区别?使用时有什么需要注意的吗?如何选择是定义一个 完

全抽象 的抽象类,还是接口?什么是接口的 显式实现 ?为什么说它很重要?

抽象类定义了一个类及其子类是什么, 而接口更多的表现出一个类可以做什么.

当一个类实现连个不同的接口, 而这两个接口中包含一些相同签名的方法时需要用到显示实现

字符串是引用类型类型还是结构类型?它和普通的引用类型相比有什么特别的地方

吗?使用字符串时有什么需要注意的地方?为什么说 StringBuilder 比较高效?在连接
多个字符串时,它无论何时都比直接相加更高效吗?

String 是引用类型, 其特殊之处在于一个 string 是不可变的, 当我们对两个 string 使用连接操作时, 会生成一个新的

string 对象, 而原来的两个 string 保持不变. 

在和 native 代码做 interop 时, 

 

对于传出参数 (char* outStr), 应当选择使用 stringbuilder 而非 string.

StringBuilder 内部维护着一个 char[] 数组, 在做连接字符的操作时会动态增加其大小, 但是, 当原有的数组不够用时, 

StringBuilder 会重新创建一个新的 char[]数组, 值得注意的是原来的数组不会被抛弃, 新创建的数组只会用作存储新

添加的字符. 

如果说 StringBuilder

有 不高效 的话,应该就是在原有数组空间用尽的情况下吧.

” “

如何高效地进行数组复制? 二维数组 和 数组的数组 有什么区别?在使用双重循

环遍历一个二维数组时,如何选择内外层的遍历顺序?

不清楚, 因为数组的元素在内存中的分布是连续的, 我能想到的方法是直接使用内存拷贝 API.

二维数组是二维的, 数组的数组是一维的.

根据内存局部性原理, CPU 在读取二维数组的第一个元素是, 第一行的数据也会被一起读入 cache, 所以应当先遍历

行,随后遍历列.

什么是元编程,.NET 有哪些元编程的手段和场景?什么是反射?能否举一些反射

的常用场景?有人说反射性能较差,您怎么看待这个问题?有什么办法可以提高反射
的性能吗?

对元编程了解十分有限, .NET 的 CodeDom(或者使用 reflection emit 动态创建类型)应当是其中的一个场景.

基于元数据, 反射帮助我们在运行时动态获取程序集/类型/方法/属性等等的信息, 可以用于加载 Addin.

有得必有失, 反射功能强大, 只要不是滥用, 其带来的益处远大于性能上的损失.