集, 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.
有得必有失, 反射功能强大, 只要不是滥用, 其带来的益处远大于性能上的损失.