Таблица методов
Поле указателя на таблицу методов ссылается на внутреннюю структуру CLR под названием таблица методов (method table), которая в свою очередь ссылается на другую внутреннюю структуру под названием EEClass (где ЕЕ, это аббревиатура от Execution Engine - механизм выполнения). Вместе, таблица методов и EEClass, содержат информацию, необходимую для выбора виртуального метода, метода интерфейса, статической переменной, определения типа объекта во время выполнения, доступа к методам базового класса и многих других целей. Таблица методов содержит часто используемую информацию, требуемую для выполнения операций такими механизмами, как механизм выбора виртуального метода, а структура EEClass содержит информацию, используемую реже, например, механизмом рефлексии. Ознакомиться с содержимым обеих структур данных можно с помощью команд !DumpMT и !DumpClass библиотеки SOS.
Массив ссылок на статические поля фиксируется так, что его адрес не может быть изменен сборщиком мусора, кроме того, статические поля простых типов размещаются внутри таблицы методов, которая не затрагивается сборщиком мусора. Это гарантирует, что для доступа к таким полям можно без опаски использовать жестко зашитые адреса.
class MyClass
{
private string _field1 = "Some string 1";
public string Field2 { get; set; }
}
0:003> !do 0000005400006600
Name: ConsoleApplication1.MyClass
MethodTable: 00007ffa2b5c4378
EEClass: 00007ffa2b6d2548
Size: 32(0x20) bytes
File: E:\...\ConsoleApplication1.exe
Fields:
MT Field Offset Type VT Attr Value Name
00007ffa89d60e08 4000002 8 System.String 0 instance 0000005400006620 _field1
00007ffa89d60e08 4000003 10 System.String 0 instance 00000054000035a0 <Field2>k__BackingField
public static void Main ()
{
bool IsExist;
using ( new Semaphore ( 0, 1, "MyAppUniqueString", out IsExist ) )
{
if ( IsExist )
{ /* Этот поток создает ядро, другие копии программы не смогут запуститься. */ }
else
{ /* Этот поток открывает существующее ядро с тем же именем.
Ничего не делаем, ждем возвращения управления от метода Main, чтобы завершить вторую копию приложения. */ }
}}
class Question {
List<Answer> Answers { get; set; }
}
class Answer {
string Text;
bool isValid;
}