Оценка времени компиляции общего типа и встраивание методов - PullRequest
0 голосов
/ 20 сентября 2019

Предположим, у меня есть следующий метод:

    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public void EmptyMethod<T>(T inputVariable) where T: parentType
    {
        if(typeof(T) is childType)
        {
            // do something
        }

        if(typeof(T) is anotherChildType)
        {
            // do other things
        }
    }

Я использую этот метод в разных местах программы, но когда я проверяю MSIL сборки выпуска, я вижу следующие вещи: 1. Методне встроенный2. Но что еще хуже - метод оценивает тип inputVariable во время выполнения (что ожидается - см. Эту ссылку https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching).

Но я бы хотел, чтобы этот метод был встроенным и тип inputVariable могоцениваться во время компиляции.

1 Ответ

3 голосов
/ 20 сентября 2019

Проверка MSIL не имеет отношения к встраиванию, поскольку это выполняется JIT - вторая фаза компиляции для кода .NET.

MSIL по-прежнему содержит общий код, который не знать с какими типами он будет использоваться.Вот почему .NET-шаблоны могут работать с единицами компиляции.

Похоже, это вовсе не должен быть универсальный код, а две перегрузки с одинаковым именем метода:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void EmptyMethod(childType inputVariable)
{
    // do something
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void EmptyMethod(anotherChildType inputVariable)
{
    // do other things
}

Если вы обнаруживаете, что выполняете проверки типов внутри своего общего кода, это, как правило, признак того, что вы выбрали не тот инструмент для этой работы.

...