1

我在老板的项目中发现了以下代码:

Dim strBuilder As New System.Text.StringBuilder("", 1000000)

在我打电话给他之前,我想确认一下这条线是否真的为那个字符串生成器设置了一个兆字节(或 Unicode 中的两个兆字节?)的内存?

4

2 回答 2

3

初始化Char()长度为 1000000 的 a。

所以内存中需要的实际大小是2000000 Bytes = ~2 MB,因为 char 是 unicode 并且需要 2 个字节。

编辑:万一你的老板不相信,这反映在 ILSpy 上:

// System.Text.StringBuilder
[SecuritySafeCritical]
public unsafe StringBuilder(string value, int startIndex, int length, int capacity)
{
    if (capacity < 0)
    {
        throw new ArgumentOutOfRangeException("capacity", Environment.GetResourceString("ArgumentOutOfRange_MustBePositive", new object[]
        {
            "capacity"
        }));
    }
    if (length < 0)
    {
        throw new ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_MustBeNonNegNum", new object[]
        {
            "length"
        }));
    }
    if (startIndex < 0)
    {
        throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_StartIndex"));
    }
    if (value == null)
    {
        value = string.Empty;
    }
    if (startIndex > value.Length - length)
    {
        throw new ArgumentOutOfRangeException("length", Environment.GetResourceString("ArgumentOutOfRange_IndexLength"));
    }
    this.m_MaxCapacity = 2147483647;
    if (capacity == 0)
    {
        capacity = 16;
    }
    if (capacity < length)
    {
        capacity = length;
    }
    this.m_ChunkChars = new char[capacity];
    this.m_ChunkLength = length;
    fixed (char* ptr = value)
    {
        StringBuilder.ThreadSafeCopy(ptr + (IntPtr)startIndex, this.m_ChunkChars, 0, length);
    }
}
于 2012-05-02T22:40:07.137 回答
1

您可以尝试 GC.GetTotalMemory()在该分配之前和之后调用,看看它是否增加。注意:这不是一个好的、科学的方法,但可以证明你的观点。

于 2012-05-02T22:39:55.590 回答