Страницы

Поиск по вопросам

суббота, 1 февраля 2020 г.

Как хранятся типы в object[] ?

#c_sharp


Есть код
    static void Main(string[] args)
    {

        object[] objects = new object[] {1, "asd", 'a'};
        foreach (var elem in objects)
        {
            Console.WriteLine(elem.GetType().ToString());
        }

        Console.ReadKey();
    }

Выводятся типы System.Int, System.String, System.Char.
Вопрос - откуда компилятор знает о типах если явного приведения нет, обратиться из
кода к методам объектов нельзя (кроме обжектовских). Мне казалось, что должны вывести
System.Object, однако выводит правильно.    


Ответы

Ответ 1



Смотрите. В .NET (как и в любом объектно-ориентированном языке) переменная-ссылка базового типа может указывать на объект производного типа. Вспомним, что в .NET object является предком всех типов. Это значит, что переменная может содержать фактически любой тип. Итак, у нас есть различие между compile-time-типом (тип ссылки) и runtime-типом (фактическим типом объекта, на который эта ссылка ссылается). Теперь, GetType(), согласно документации, возвращает именно runtime-тип, то есть настоящий тип объекта по ссылке. Каким именно образом это реализовано, для программиста не должно быть важно. На самом деле, каждый объект в .NET неявно хранит указатель на таблицу с метаданными, в которых описан его тип — но это деталь конкретной реализации, на которую опираться не стоит.

Комментариев нет:

Отправить комментарий