Обычно обработка struct S
в качестве интерфейса I
приведет к автобоксированию структуры, которая может иметь влияние на производительность, если это делается часто. Однако, если я напишу общий метод, берущий параметр типа T : I
и вызывая его с помощью S
, тогда компилятор опустит бокс, так как он знает тип S
и не должен использовать интерфейс?
Этот код показывает мою точку зрения:
interface I{
void foo();
}
struct S : I {
public void foo() { /* do something */ }
}
class Y {
void doFoo(I i){
i.foo();
}
void doFooGeneric<T>(T t) where T : I {
t.foo(); // <--- Will an S be boxed here??
}
public static void Main(string[] args){
S x;
doFoo(x); // x is boxed
doFooGeneric(x); // x is not boxed, at least not here, right?
}
}
Метод doFoo
вызывает foo()
объекта типа I
, поэтому, как только мы назовем его S
, этот S
получит коробку. Метод doFooGeneric
делает то же самое. Однако, как только мы вызываем его с помощью S
, автооблок не требуется, поскольку среда выполнения знает, как вызвать foo()
на S
. Но это будет сделано? Или будет ли окно S
вслепую в I
вызвать метод интерфейса?