ive代码做interop时, 对于传出参数 (char* outStr), 应当选择使用stringbuilder而非string.
StringBuilder内部维护着一个char[] 数组, 在做连接字符的操作时会动态增加其大小, 但是, 当原有的数组不够用时, StringBuilder会重新创建一个新的char[]数组, 值得注意的是原来的数组不会被抛弃, 新创建的数组只会用作存储新添加的字符.
如果说StringBuilder有”不高效”的话,应该就是在原有数组空间用尽的情况下吧.
> 如何高效地进行数组复制?“二维数组”和“数组的数组”有什么区别?在使用双重循环遍历一个二维数组时,如何选择内外层的遍历顺序?
不清楚, 因为数组的元素在内存中的分布是连续的, 我能想到的方法是直接使用内存拷贝API.
二维数组是二维的, 数组的数组是一维的.
根据内存局部性原理, CPU在读取二维数组的第一个元素是, 第一行的数据也会被一起读入cache, 所以应当先遍历行,随后遍历列.
> 什么是元编程,.NET有哪些元编程的手段和场景?什么是反射?能否举一些反射的
常用场景?有人说反射性能较差,您怎么看待这个
问题?有什么办法可以提高反射的性能吗
对元编程了解十分有限, .NET的CodeDom(或者使用reflection emit动态创建类型)应当是其中的一个场景.
基于元数据, 反射帮助我们在运行时动态获取程序集/类型/方法/属性等等的信息, 可以用于加载Addin.
有得必有失, 反射功能强大, 只要不是滥用, 其带来的益处远大于性能上的损失.
> 委托是什么?匿名方法是什么?在C# 3.0中,Lambda表达式是什么?扩展方法是什么?LINQ是什么?您觉得C# 3.0中还有哪些重要的特性,它们带来了什么优势?BCL中哪些类库和这些特性有关?您平时最常用哪些
委托可以认为是类型安全的函数指针, 此处省略741个字…
说起来我也面试过相当数量的.NET(包括C#,后文不重复)程序员了,有的通过电话,有的面谈。后来发现,其实提的问题来来回回也就那么几个。这些
问题有的已经有十年历史了,至少也有三年。我想