Что точно самоописание вводит в среднем .NET?

Учитывая эту статью MSDN, мы узнаем, что Общая система типов в .NET имеет эту классификацию ссылочных типов:

"Ссылочные типы могут самоописывать типы, типы указателей, или соединять интерфейсом с типами. Тип ссылочного типа может быть определен от значений самоописания типов. Самоописывающие типы далее разделяются на массивы и типы классов".

  1. Таким образом, массив, например, является типом самоописания, потому что мы можем определить его тип от его значений?
  2. Как?
  3. Это - это или там больше к этому определению?

7
задан tzup 11 May 2010 в 11:52
поделиться

3 ответа

Самоописывающийся тип - это тип, который описывается метаданными, доступными о нем самом. Наиболее распространенной формой являются типы классов. Там довольно легко показать, что значит самоописывающийся тип:

Сам тип описывается определением класса. Например, класс 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

Для массивов все аналогично: Классы массивов содержат информацию о количестве записей, а также информацию о типе (см. выше) хранимых записей.

3
ответ дан 7 December 2019 в 03:12
поделиться

Возможно, лучшим способом показать, как типы указателей и интерфейсные типы не самоописываются, будет пример:

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

Другими словами, объекты, объявленные как интерфейсный тип, могут описывать только класс, который их реализует. Указатели могут описывать только тип объекта, на который они указывают.

3
ответ дан 7 December 2019 в 03:12
поделиться

Тип с самоописанием - это тип данных, который предоставляет информацию о себе для сборщика мусора. Практически любой тип, который имеет какую-либо форму метаданных, например. сборка, будет считаться типом с самоописанием.

3
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: