Назначение и значение "specialname" и "rtspecialname" в IL

В настоящее время я пытаюсь понять код IL и внутренности C# специально, я написал простую мировую программу на C#, код которой:

using System;
class Program
{
    public static void Main()
    {
       Console.WriteLine("Hello World");
    }
}

и вот IL, созданный для конструктора Program учебный класс:

.method public hidebysig specialname rtspecialname 
        instance void  .ctor() cil managed
{
  // Code size       7 (0x7)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  call       instance void [mscorlib]System.Object::.ctor()
  IL_0006:  ret
} // end of method Program::.ctor

Я не могу понять, в чем смысл и назначение specialname и rtspecialname или как они используются?

1 ответ

Согласно стандарту ECMA 355:

rtspecialname указывает, что имя этого элемента имеет особое значение для CLI. В настоящее время нет определенных имен специальных типов; это для будущего использования. Любой предмет, помеченный как rtspecialname, также должен быть отмечен как specialname

specialname указывает, что имя этого элемента может иметь особое значение для инструментов, отличных от CLI. См. Например, Раздел I.

Эти атрибуты используются либо инструментами, либо средой выполнения, чтобы определить, имеет ли атрибут или метод специальное использование или значение. Один из примеров ( Какие еще хитрые приемы допускает SpecialNameAttribute?) - пометить оператор для предотвращения конфликтов с пространством имен пользователя. Еще один, который я вижу в стандарте, предназначен для методов получения и установки свойств, и кажется, что Main метод, который вы привели, является еще одним примером.


Хотя я пометил первоначальный вопрос как дубликат, этот вопрос несколько отличается по своему охвату, и ответ здесь может пролить немного больше света. Я все равно надеюсь.

Другие вопросы по тегам