是什么原因导致enum.ToString()实际代理它所代表的成员

Jer*_*vel 8 c# enums memory-management tostring

我一直在研究调用.ToString()枚举成员的效果- 更具体地说是它是否创建了一个新的字符串对象.

请考虑以下枚举定义:

enum MyEnum
{
    MyValue = 0,
    MyOtherValue = 1
}
Run Code Online (Sandbox Code Playgroud)

如果我在断点上执行以下代码x,yz在每个点进行堆转储

static void Main(string[] args)
{
    Console.WriteLine(typeof(MyEnum));

    var x = MyEnum.MyValue.ToString(); // Breakpoint 1
    var y = MyEnum.MyValue.ToString(); // Breakpoint 2
    var z = MyEnum.MyOtherValue.ToString(); // Breakpoint 3

    Console.WriteLine(x, y, z);
}
Run Code Online (Sandbox Code Playgroud)

我可以看到以下结果:

| Stage   | # string objects |
|---------|------------------|
| Initial | 463              |
| BP 1    | 465              |
| BP 2    | 465              |
| BP 3    | 466              |
Run Code Online (Sandbox Code Playgroud)

我查看了enum.cs但找不到导致(缺少?)分配的原因.

  1. 在第一个断点处导致两次分配的原因是什么?
  2. 为什么第二次调用没有导致分配?我没有在字符串池中看到任何查找,并且我不希望这些枚举名称被中断,因为它们是通过调用使用反射来查找它的虚方法来检索的.
  3. 通过在每个快照上手动检查堆上的字符串值,我可以看到第1步添加"MyValue",第2步不添加任何内容,第3步添加"MyOtherValue".

最重要的问题是为什么它Enum.ToString()似乎实际上代表它所代表的成员.代码的哪一部分导致实习?