相关疑难解决方法(0)

Java和.NET字符串文字在哪里?

关于 .NET中字符串文字的最新问题引起了我的注意.我知道字符串文字被实习,因此具有相同值的不同字符串引用同一个对象.我也知道字符串可以在运行时实现:

string now = DateTime.Now.ToString().Intern(); 
Run Code Online (Sandbox Code Playgroud)

显然,在运行时实例化的字符串驻留在堆上,但我假设文字放在程序的数据段中(并且在我对所述问题的回答中这样说).但是我不记得在任何地方看到这个.我认为这是这种情况,因为我是如何做到这一点以及ldstrIL指令用于获取文字并且似乎没有进行分配的事实似乎支持我.

简而言之,字符串文字在哪里?它是在堆上,数据段还是我没想过的某个地方?


编辑:如果字符串文字确实驻留在堆上,它们何时分配?

.net java string-literals string-table

28
推荐指数
2
解决办法
8727
查看次数

实习生字符串文字误解?

我不明白:

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"?

我有点困惑.

.net c# string-interning

5
推荐指数
2
解决办法
1194
查看次数

string.Replace(string,string)是否会创建其他字符串?

我们需要将包含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来创建输出文件.而且我也知道丢弃的字符串将被垃圾收集(在时间结束之前的某个时刻).我想知道是否有更好,更有效的方法来替换字符串中所有出现的特定字符/子字符串,这不会另外创建字符串.

.net c#

2
推荐指数
2
解决办法
683
查看次数