Учитывая эту статью MSDN, мы узнаем, что Общая система типов в .NET имеет эту классификацию ссылочных типов:
"Ссылочные типы могут самоописывать типы, типы указателей, или соединять интерфейсом с типами. Тип ссылочного типа может быть определен от значений самоописания типов. Самоописывающие типы далее разделяются на массивы и типы классов".
Самоописывающийся тип - это тип, который описывается метаданными, доступными о нем самом. Наиболее распространенной формой являются типы классов. Там довольно легко показать, что значит самоописывающийся тип:
Сам тип описывается определением класса. Например, класс customer с именем, возрастом и customerid. Чистые данные для экземпляра этого класса будут выглядеть примерно так:
8%3|*1C U S T O M E R
Только потому, что в среде есть описание класса, содержащее метаданные, вы действительно знаете, что некоторые из этих данных образуют id, возраст и имя. А для идентификации метаданных данные о содержимом объекта объединяются с идентификатором класса, чтобы среда могла сопоставить описание класса с метаданными.
|Class metadata reference: Metadata for the customer class
| |Customer ID: Field
| | |Customer Age: Field
| | ||Customer Name : Field
8%3|*1C U S T O M E R
Для массивов все аналогично: Классы массивов содержат информацию о количестве записей, а также информацию о типе (см. выше) хранимых записей.
Возможно, лучшим способом показать, как типы указателей и интерфейсные типы не самоописываются, будет пример:
using System;
interface ISample { }
class CSample : ISample { }
class Program {
static unsafe void Main(string[] args) {
ISample itf = new CSample();
var it = itf.GetType();
Console.WriteLine(it.FullName);
int value = 42;
int* p = &value;
var pt = p->GetType();
Console.WriteLine(pt.FullName);
Console.ReadLine();
}
}
Вывод:
CSample
System.Int32
Другими словами, объекты, объявленные как интерфейсный тип, могут описывать только класс, который их реализует. Указатели могут описывать только тип объекта, на который они указывают.
Тип с самоописанием - это тип данных, который предоставляет информацию о себе для сборщика мусора. Практически любой тип, который имеет какую-либо форму метаданных, например. сборка, будет считаться типом с самоописанием.