Назначение и значение "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
метод, который вы привели, является еще одним примером.
Хотя я пометил первоначальный вопрос как дубликат, этот вопрос несколько отличается по своему охвату, и ответ здесь может пролить немного больше света. Я все равно надеюсь.