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

时间:2015-06-26 23:16:45

标签: c#

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

string s = "Hello World!";

它是否会调用任何这些构造函数?

public String(char* value);
public String(char[] value);

2 个答案:

答案 0 :(得分: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] ResolveStringRef来电InitializeStringData,然后LoaderAllocator::GetStringObjRefPtrFromUnicodeString
  5. [vm/loaderallocator.cpp] GetStringObjRefPtrFromUnicodeString调用LoaderAllocator特定的字符串文字地图GetStringLiteral
  6. [vm/stringliteralmap.cpp] GetStringLiteral哈希字符串并尝试从本地字符串条目哈希表中获取字符串对象。如果找到,则返回哈希表中的字符串对象。如果没有,则尝试get the string object from the global string literal map。如果未在全球地图中找到该文字,则会使用GlobalStringLiteralMap::AddStringLiteral将其添加到全球地图中。
  7. AddStringLiteral通过调用AllocateStringObject创建COM +字符串对象,为其分配对象句柄,并将文字作为键添加到表中,将对象作为值添加。
    • AllocateStringObject:计算char计数,call is made to the garbage collector分配该大小的字符串,将字符串常量复制到COM +字符串对象,使用{{3}测试字符串对象如果为true,则在COM +字符串对象“ GetIsOnlyLowChars中设置标志STRING_STATE_FAST_OPS。标志将持久保存到包含字符串文字的汇编。当我们从汇编语句加载字符串时,我们会恢复标志... 的”
  8. 一直回到[vm / interpreter.cpp]:字符串对象句柄被推送到堆栈。
  9. 总之,字符串文字采用非常特定的路径,不会对托管的String(char *)String(char[])构造函数进行任何调用。但是,我还没有找到那些构造函数的实现,所以我只能假设他们在某个时候都调用AllocateStringObject

    我希望这个答案符合你的“确切”的想法。

答案 1 :(得分:2)

这是C#:

public static void Main (string[] args)
{
    string hello = "Hello World!";
    Console.WriteLine (hello);
}

这是IL:

// method line 2
.method public static hidebysig 
       default void Main (string[] args)  cil managed 
{
    // Method begins at RVA 0x20f4
.entrypoint
// Code size 13 (0xd)
.maxstack 2
.locals init (
    string  V_0)
IL_0000:  ldstr "Hello World!"
IL_0005:  stloc.0 
IL_0006:  ldloc.0 
IL_0007:  call void class [mscorlib]System.Console::WriteLine(string)
IL_000c:  ret 
} // end of method MainClass::Main
  

ldstr指令将对象引用(类型O)推送到新的   表示存储在中的特定字符串文字的字符串对象   元数据。 ldstr指令分配必需的数量   内存并执行转换所需的任何格式转换   从文件中使用的表单到字符串格式的字符串文字   在运行时需要。