字符串初始化期间会发生什么?
string s = "Hello World!";
Run Code Online (Sandbox Code Playgroud)
它是否会调用这些构造函数中的任何一个?
public String(char* value);
public String(char[] value);
Run Code Online (Sandbox Code Playgroud)
我看了一下CoreCLR存储库,看看底部有什么ldstr(参见Filip Bulovic的回答),发现路径是这样的:
[vm/interpreter.cpp]解释器的IL评估循环命中case CEE_LDSTR和调用Interpreter::LdStr()LdStr()调用ConstructStringLiteral并传递当前方法的模块和字符串指针(当前IL指令位置+ 1)[vm/jithelpers.cpp] ConstructStringLiteral 电话 Module::ResolveStringRef[vm/ceeload.cpp] ResolveStringRefInitializeStringData然后打电话LoaderAllocator::GetStringObjRefPtrFromUnicodeString[vm/loaderallocator.cpp] GetStringObjRefPtrFromUnicodeString 调用LoaderAllocator特定的字符串文字映射 GetStringLiteral[vm/stringliteralmap.cpp] GetStringLiteral哈希字符串并尝试从本地字符串条目哈希表中获取字符串对象.如果找到,则返回哈希表中的字符串对象.如果不是,则尝试从全局字符串文字映射中获取字符串对象.如果未从全局地图中找到文字,则将其添加到全局地图中GlobalStringLiteralMap::AddStringLiteral.AddStringLiteral通过调用创建COM +字符串对象AllocateStringObject,为其分配对象句柄,并将文字作为键添加到表中,将对象作为值添加.
AllocateStringObject:计算char计数,调用垃圾收集器分配该大小的字符串,将字符串常量复制到COM +字符串对象,测试字符串对象GetIsOnlyLowChars,如果为true,STRING_STATE_FAST_OPS则在COM +字符串对象" ...表示字符串是否可以快速排序.标志将持久保存到包含字符串文字的汇编.当我们从汇编中加载字符串时,我们恢复标志... "
总之,字符串文字采用非常特定的路径,不会对托管String(char *)或String(char[])构造函数进行任何调用.但是,我还没有找到那些构造函数的实现,所以我只能假设他们都AllocateStringObject在某个时候打电话.
我希望这个答案符合你的"确切"的想法.