Затем вы можете проверить или проверить, затем бросить?

Возможный дубликат:
Кастинг против использования ключевого слова 'as в CLR

Какой метод считается лучшей практикой?

Перенесите сначала?

public string Describe(ICola cola)
{
    var coke = cola as CocaCola;
    if (coke != null)
    {
        string result;
        // some unique coca-cola only code here.
        return result;
    }
    var pepsi = cola as Pepsi;
    if (pepsi != null)
    {
        string result;
        // some unique pepsi only code here.
        return result;
    }
}

Или сначала я должен проверить, бросить позже?

public string Describe(ICola cola)
{
    if (cola is CocaCola)
    {
        var coke = (CocaCola) cola;
        string result;
        // some unique coca-cola only code here.
        return result;
    }
    if (cola is Pepsi)
    {
        var pepsi = (Pepsi) cola;
        string result;
        // some unique pepsi only code here.
        return result;
    }
}

Вы можете увидеть какой-либо другой способ сделать это?

Ответы

Ответ 1

Если объект может или не может быть того типа, который вам нужен, оператор as (ваш первый метод) лучше двумя способами:

  • Считываемость и простота обслуживания: вы указываете тип один раз
  • Производительность: вы выполняете только один раз, а не дважды. (Пути: при использовании ключевого слова is компилятор С# внутренне переводит его на as, то есть. coke is Cola эквивалентно (coke as Cola) != null)

Если объект всегда должен быть запрошенного типа, тогда просто сделайте (Coke)cola и дайте ему исключение, если это не так.

Ответ 2

Первый (кастинг первый через as) немного более эффективен, поэтому в этом отношении он может быть наилучшей практикой.

Однако, код выше, в общем, отображает немного "запаха кода". Я бы подумал о рефакторинге любого кода, который следует за этим шаблоном, если это возможно. Пусть ICola предоставит метод описания и пусть он описывает себя. Это позволяет избежать проверки типа и дублированного кода...

Ответ 3

В этом примере используется локальный параметр, безопасный, но много раз проверка типа применяется к полям (переменным-членам) класса. В этом случае "как" -это-проверка безопасна, но "есть" -то-литье создает безвозмездное состояние гонки.

Ответ 4

Я думаю, что это более эффективный первый способ: Cast, а затем проверить, но...

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

Ответ 5

Позвольте мне просто поместить его там. Но я думаю, что это не так. В вашем конкретном примере, почему у вас вообще есть интерфейс? Я бы предложил метод "Описать" на вашем интерфейсе ICola, а затем реализовать описательную логику в ваших классах CocaCola и Pepsi, которые реализуют интерфейс.

Итак, в основном, это // some unique <some cola> only code here. в классы реализации.

Но чтобы ответить на ваш вопрос, я думаю, что проверка-то-литье более подходит.