字符串初始化期间会发生什

Raj*_*rri 9 c#

字符串初始化期间会发生什么?

string s = "Hello World!";
Run Code Online (Sandbox Code Playgroud)

它是否会调用这些构造函数中的任何一个?

public String(char* value);
public String(char[] value);
Run Code Online (Sandbox Code Playgroud)

cub*_*brr 5

我看了一下CoreCLR存储库,看看底部有什么ldstr(参见Filip Bulovic的回答),发现路径是这样的:

  1. [vm/interpreter.cpp]解释器的IL评估循环命中case CEE_LDSTR和调用Interpreter::LdStr()
  2. LdStr()调用ConstructStringLiteral并传递当前方法的模块和字符串指针(当前IL指令位置+ 1)
  3. [vm/jithelpers.cpp] ConstructStringLiteral 电话 Module::ResolveStringRef
  4. [vm/ceeload.cpp] ResolveStringRefInitializeStringData然后打电话LoaderAllocator::GetStringObjRefPtrFromUnicodeString
  5. [vm/loaderallocator.cpp] GetStringObjRefPtrFromUnicodeString 调用LoaderAllocator特定的字符串文字映射 GetStringLiteral
  6. [vm/stringliteralmap.cpp] GetStringLiteral哈希字符串并尝试从本地字符串条目哈希表中获取字符串对象.如果找到,则返回哈希表中的字符串对象.如果不是,则尝试从全局字符串文字映射中获取字符串对象.如果未从全局地图中找到文字,则将其添加到全局地图中GlobalStringLiteralMap::AddStringLiteral.
  7. AddStringLiteral通过调用创建COM +字符串对象AllocateStringObject,为其分配对象句柄,并将文字作为键添加到表中,将对象作为值添加.
    • AllocateStringObject:计算char计数,调用垃圾收集器分配该大小的字符串,将字符串常量复制到COM +字符串对象,测试字符串对象GetIsOnlyLowChars,如果为true,STRING_STATE_FAST_OPS则在COM +字符串对象" ...表示字符串是否可以快速排序.标志将持久保存到包含字符串文字的汇编.当我们从汇编中加载字符串时,我们恢复标志... "
      • GetIsOnlyLowChars如果字符串只包含小于0x80的字符,则使用ONLY_LOW_CHARS_MASK(即0x80000000)和字符串中的字符进行按位AND 并返回true.托管(内部)方法String.IsFastSort()ref | srcString.IsAscii()ref | src使用这个.
  8. 一直回到[vm/interpreter.cpp]:字符串对象句柄被推送到堆栈.

总之,字符串文字采用非常特定的路径,不会对托管String(char *)String(char[])构造函数进行任何调用.但是,我还没有找到那些构造函数的实现,所以我只能假设他们都AllocateStringObject在某个时候打电话.

我希望这个答案符合你的"确切"的想法.