C# 字符串创建
我有一个关于在循环中创建字符串的问题,下面是一个代码示例:C# 字符串创建,c#,.net,string,C#,.net,String,我有一个关于在循环中创建字符串的问题,下面是一个代码示例: static void Main(string[] args) { for (int i = 1; i <= 1000000; i++) { Add(GetStr()); } Console.WriteLine("hmmmmmmmm"); Console.ReadLine(); } public
static void Main(string[] args)
{
for (int i = 1; i <= 1000000; i++)
{
Add(GetStr());
}
Console.WriteLine("hmmmmmmmm");
Console.ReadLine();
}
public static string GetStr()
{
return "OK";
}
public static void Add(string str)
{
list.Add(str);
}
static void Main(字符串[]args)
{
对于(int i=1;i
在上述代码的情况下,将在内存中创建多少个字符串
一个。(如果包含“hmmmmmmm”
,则实际上是两个)
此方法返回一个常量字符串文本:
public static string GetStr()
{
return "OK";
}
它被编译成如下IL代码:
ldstr "OK"
ret
操作码将引用推送到元数据中存储的字符串文本,操作码将返回该引用
这意味着“OK”
在元数据中只分配一次。列表中的所有条目都将引用该实例
请注意,默认情况下,字符串文本是被插入的。因此,在插入之前不会分配“临时字符串”,因此不需要垃圾收集。在您的情况下,将有两个由代码创建的字符串:“OK”和“HMMMM”。因为字符串a是不可变的类型,所以“OK”将只创建一次,每次需要时,字符串都将被引用。我已修改了您的代码,以便您可以看到字符串“OK”的内存地址
长期:一个,原因是。尽管每次调用GetStr
,都会先分配一个字符串,然后再对其进行缓存,然后再进行垃圾收集。我认为这不应该作为重复项关闭。引用的问题是关于动态字符串的。这个问题是关于常量字符串文字。“确定”
将被翻译成LDSTR
IL操作码,该操作码将引用推送到元数据中存储的字符串。因此只会分配一个字符串。在被拘留之前不会分配任何临时字符串。@BassamAlugili:列表中的100亿引用非常多:-)@MårtenWikströM是的,100亿之前的异常cam我也看到了IL代码一个字符串,它将被引用。我稍微更改了GetStr()代码,它创建了1000000多个字符串byte[]bytes=System.Text.Encoding.UTF8.GetBytes(“OK”);return System.Text.Encoding.UTF8.GetString(bytes)@RoyaanKhan:好的。然后每次强制系统动态分配一个新字符串。“好的”
仍然是对元数据中存储的字符串的引用。但是,UTF.GetString(字节)
将在每次调用时分配一个新的字符串实例。事实上,字符串是一个不可变的类型,并且它只创建了一次,这是“连接”的,但它不是“a意味着B”,而是“因为a,我们(.NET creators)可以做B,我们做了B”。谢谢@peer给我这个提示就是答案因为不可变类型的字符串将创建一次“+1”
using System;
namespace ConsoleApplication4
{
using System.Collections.ObjectModel;
public class Program
{
static unsafe Collection<string> list = new Collection<string>();
static unsafe void Main(string[] args)
{
for (int i = 1; i <= 10; i++)
{
Add(GetStr());
}
foreach (var str in list)
{
fixed (char* ptr = str)
{
var addr = (IntPtr)ptr;
Console.WriteLine(addr.ToString("x"));
}
}
Console.WriteLine("hmmmmmmmm");
Console.ReadLine();
}
public unsafe static string GetStr()
{
return "OK";
}
public unsafe static void Add(string str)
{
list.Add(str);
}
}
}
#225bf54
#225bf54
#225bf54
#225bf54
#225bf54
#225bf54
#225bf54
#225bf54
#225bf54
#225bf54
hmmmmmmmm