我很好奇StringBuilder类是如何在内部实现的,因此我决定查看Mono的源代码并将其与Reflector的反汇编代码进行比较.从本质上讲,Microsoft的实现用于char[]
在内部存储字符串表示,以及一些不安全的方法来操作它.这很简单,没有提出任何问题.但当我发现Mono在StringBuilder中使用一个字符串时,我很困惑:
private int _length;
private string _str;
Run Code Online (Sandbox Code Playgroud)
第一个想法是:"多么无谓的StringBuilder".但后来我发现可以使用指针改变字符串:
public StringBuilder Append (string value)
{
// ...
String.CharCopy (_str, _length, value, 0, value.Length);
}
internal static unsafe void CharCopy (char *dest, char *src, int count)
{
// ...
((short*)dest) [0] = ((short*)src) [0]; dest++; src++;
}
Run Code Online (Sandbox Code Playgroud)
我曾经在C/C++中编程一点,所以我不能说这段代码让我很困惑,但我认为字符串是完全不可变的(即绝对没有办法改变它).所以实际的问题是:
向大家致以问候.对不起,如果以前已经问过这个问题(徒劳无功),或者说非常简单,但我无法得到它.Nullable类型的MSDN定义声明它是以下列方式定义的:
[SerializableAttribute]
public struct Nullable<T>
where T : struct, new()
Run Code Online (Sandbox Code Playgroud)
所以问题非常简单:这个定义怎么可能?或者这只是一个错字?每个值类型都有一个默认构造函数.实际上,当我尝试编译这样的东西时,编译器合理地说,同时应用两个约束是非法的,因为第二个隐含地包含在第一个约束中.
提前致谢.
嗯,"Endianness"主题对我来说总是有点混乱,但我从来没有遇到任何问题,这些问题要求我甚至考虑我使用的二进制编写器/阅读器的默认行为.我正在c#中写一个PNG解码器.PNG文件格式规范声明所有数字都以大端符号存储(我觉得非常自然).但是,当我注意到.NET的BinaryReader/Writer使用一点endian符号时,我感到非常惊讶.令我更加困惑的是,事实上,java的二进制IO与大端符号一起工作(不是java程序员,所以也许我错了).所以我开始考虑以下问题:
1 - 为什么它们是这样的?我的意思是基类库的默认行为.2 - 为什么在使用.NET的System.IO时无法选择首选符号?
我目前正在使用Jon Skeet的 MiscUtil,它就像一个魅力(感谢,man =)).但是在基类库中看到这个功能会很酷.
我在一些遗留代码中遇到了一大堆旧的方法调用,其中一个或一些正在制造瓶颈并且确实减慢了速度.有没有快速的方法我可以获得一个报告,说明哪些方法调用花费时间,没有在调试中运行,单步执行并查看光标暂停的位置?