Почему интерфейсы в ссылочных типах .Net? - PullRequest
12 голосов
/ 09 января 2011

Почему интерфейсы ссылаются на типы?Насколько я понимаю, интерфейс - это контракт между классами (или структурами), так почему он вообще является типом?Я бы подумал, что это не тип значения или ссылочный тип.

Ответы [ 2 ]

11 голосов
/ 09 января 2011

Чтобы считаться структурой, компилятор должен знать во время компиляции , что представляет собой конкретный тип, чтобы зарезервировать правильное пространство в стеке. Это означает, что , даже если структура реализует IFoo, тогда с:

var ms = new MyStruct();
IFoo foo = ms;

, тогда присвоение foo является операцией бокса. Вы могли бы сказать, что «компилятор должен заметить, что это только foo и использовать« заключенный »код операции», но в общем случае (с множественными присвоениями foo и т.д.) это невозможно (Я бы рискнул предположить, что это решит проблему остановки).

Существует также проблема виртуального или статического вызова, но «ограниченный» код операции работает вокруг этого.

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

Существует одно исключение: общие ограничения.

Если у вас есть

static void DoBar<T>(T target) where T : IFoo {
    target.Bar();
}

здесь метод JITted один раз для каждого типа значения, поэтому пространство стека, необходимое для T , известно как ; вызов Bar является «ограниченным» и может быть виртуальным или статическим автоматически при необходимости.

3 голосов
/ 09 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...