内存管理如何在字节和字符串之间工作?

时间:2015-10-16 09:59:22

标签: c# memory-management

C#中如果我有4-5 GB数据现在采用bytes格式,那么我将其转换为string那么会产生什么影响这对于内存以及如何在为大字符串使用变量时更好地进行内存管理?

代码

 public byte[] ExtractMessage(int start, int end)
    {
        if (end <= start)
            return null;

        byte[] message = new byte[end - start];
        int remaining = Size - end;

        Array.Copy(Frame, start, message, 0, message.Length);

        // Shift any remaining bytes to front of the buffer
        if (remaining > 0)
            Array.Copy(Frame, end, Frame, 0, remaining);

        Size = remaining;
        ScanPosition = 0;

        return message;
    }



   byte[] rawMessage = Buffer.ExtractMessage(messageStart, messageEnd);

   // Once bytes are received, I want to create an xml file which will be used for further more work 

string msg = Encoding.UTF8.GetString(rawMessage);

CreateXMLFile(msg);

 public void CreateXMLFile(string msg)
        {
            string fileName = "msg.xml";
            if (File.Exists(fileName))
            {
                File.Delete(fileName);
            }
            using (File.Create(fileName)) { };

            TextWriter tw = new StreamWriter(fileName, true);
            tw.Write(msg);
            tw.Close();
        }

1 个答案:

答案 0 :(得分:2)

.NET字符串存储为unicode,这意味着每个字符有两个字节。当您使用UTF8时,转换为字符串时,内存使用量会翻倍。

将文本转换为string后,除非您尝试修改,否则不会再发生任何事情。 string个对象是不可变的,这意味着每次使用Remove()之类的方法修改它时,都会创建该字符串的新副本。

您可以在此处阅读更多内容:How are strings passed in .NET?

但是,字节数组总是通过引用传递,每次更改都会影响保存它的所有变量。因此,更改不会影响性能/内存消耗。

您可以使用byte[]从字符串中获取var buffer = yourEncoding.GetBytes(yourString);。可以使用静态变量访问常用编码:var buffer= Encoding.UTF8.GetBytes(yourString);