Чтобы привести более конкретный пример, чем то, что написано в документации, у вас может быть язык, который поддерживает встраивание вызовов статических методов, которые помечаются с помощью какого-то специального модификатора (из статического класса):
static class Bar {
static inline void Foo(int a) { // Note fictional 'inline' modifier
return a + 10;
}
}
Если у вас есть такой класс, на него не ссылается ни одна другая часть вашего кода. Когда вы пишете:
int y = Bar.Foo(x);
Компилятор компилирует это как:
int y = x + 10;
Вам необходимо сохранить определение Bar
в скомпилированном коде, потому что, если вы ссылаетесь на сборку из какого-то другого проекта, вы захотите увидеть его (и когда вы затем вызовете метод Foo
, компилятор просто возьмите скомпилированный IL из этой сборки).
Однако класс Bar
никогда не будет использоваться во время выполнения (он предназначен только для хранения кода, но не для его фактического выполнения). Я полагаю, вы могли бы пометить его как Discardable
, а JIT мог бы пропустить его при создании собственного кода для вашей сборки (потому что класс никогда не будет использоваться).