Как типы интерфейса загружаются в CLR?
Загружает ли CLR типы интерфейсов, если они не инициализированы конкретными реализациями?
Учитывая интерфейс IFoo, который имеет реализацию FooImpl
например
IFoo foo;
в отличие от
IFoo foo = new FooImpl();
Будет ли CLR загружать IFoo Type только во втором случае? Также, если есть другой тип, который наследуется от FooImpl (например, FooImpl2)
Будет ли этот код начинаться с FooImpl2 и подниматься по иерархии наследования для загрузки интерфейса IFoo? Кроме того, будет ли метод MethodTable IFoo содержать указатель непосредственно на таблицу методов FooImpl2 или он будет перенаправлен через промежуточный тип реализации (например, FooImpl).
IFoo foo = new FooImpl2();
1 ответ
Эта строка кода
IFoo foo;
говорит, что foo
переменная, которая может содержать ссылку на объект, который реализует интерфейс IFoo
,
Будет ли CLR загружать IFoo Type только во втором случае?
Во втором случае вы создаете объект типа FooImpl
и вы используете переменную под названием foo
который хранит ссылку на этот объект. Чтобы переменная содержала ссылку на объект, тип переменной должен соответствовать этому объекту. Говоря о соответствии, я имею в виду, что либо тип переменной будет совпадать с типом создаваемого вами объекта, либо будет базовым типом или интерфейсом. Это, как говорится, нет никакой нагрузки на любой интерфейс.
Эта строка кода:
IFoo foo = new FooImpl();
говорит, что foo
будет содержать ссылку на объект, который реализует IFoo
интерфейс, только это.
Также, если есть другой тип, который наследуется от FooImpl (например, FooImpl2), будет ли этот код начинаться с FooImpl2 и подниматься по иерархии наследования для загрузки интерфейса IFoo?
нет
Кроме того, будет ли метод MethodTable IFoo содержать указатель непосредственно на таблицу методов FooImpl2 или он будет перенаправлен через промежуточный тип реализации (например, FooImpl).
Ссылка, которая будет храниться в переменной, будет указывать на директиву таблицы методов FooImpl2. На самом деле, он будет указывать на конкретный объект, хранящийся в куче, и будет ссылка на таблицу метода FooImpl2
,