Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字符串创建_C#_.net_String - Fatal编程技术网

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