关于 .NET中字符串文字的最新问题引起了我的注意.我知道字符串文字被实习,因此具有相同值的不同字符串引用同一个对象.我也知道字符串可以在运行时实现:
string now = DateTime.Now.ToString().Intern();
Run Code Online (Sandbox Code Playgroud)
显然,在运行时实例化的字符串驻留在堆上,但我假设文字放在程序的数据段中(并且在我对所述问题的回答中这样说).但是我不记得在任何地方看到这个.我认为这是这种情况,因为我是如何做到这一点以及ldstrIL指令用于获取文字并且似乎没有进行分配的事实似乎支持我.
简而言之,字符串文字在哪里?它是在堆上,数据段还是我没想过的某个地方?
编辑:如果字符串文字确实驻留在堆上,它们何时分配?
我不明白:
MSDN说
http://msdn.microsoft.com/en-us/library/system.string.intern.aspx
因此,具有特定值的文字字符串实例仅在系统中存在一次.
例如,如果将相同的文字字符串分配给多个变量,则运行时将从实习池中检索对文字字符串的相同引用,并将其分配给每个变量.
这种行为是默认的(没有实习生)吗?或者使用Intern方法?
如果是默认值,为什么我要使用实习生?(实例将一次......)?
如果它是NOT默认值:如果我写了1000次这一行:
Console.WriteLine( "LALALA");
1)我会在记忆中得到1000次"lalala"吗?(不使用实习生...)
2)将"lalala"最终Gc'ed?
3)"lalala"是否已被实习?如果确实如此,为什么我需要从池中"获取"它,而不是再次写"lalala"?
我有点困惑.
我们需要将包含dd/mm/yyyy格式日期的字符串转换为ddmmyyyy格式(如果您想知道我为什么要在字符串中存储日期,我的软件会处理批量事务文件,这是一种基于行的文本文件格式,由银行使用).
我目前正在这样做:
string oldFormat = "01/01/2014";
string newFormat = oldFormat.Replace("/", "");
Run Code Online (Sandbox Code Playgroud)
果然,这转化"01/01/2014"为"01012014".但我的问题是,替换是在一步中发生的,还是它创建了一个中间字符串(例如:"0101/2014"或"01/012014")?
这就是我问这个问题的原因:
我正在处理大小从几千字节到几百兆字节的事务文件.到目前为止,我还没有出现性能/内存问题,因为我仍在使用非常小的文件进行测试.但是当谈到兆字节时,我不确定我是否会遇到这些额外字符串的问题.我怀疑情况会是这样,因为strings是不可变的.有了数百万条记录,这种额外的内存消耗将大大增加.
我已经在使用StringBuilders来创建输出文件.而且我也知道丢弃的字符串将被垃圾收集(在时间结束之前的某个时刻).我想知道是否有更好,更有效的方法来替换字符串中所有出现的特定字符/子字符串,这不会另外创建字符串.