Листинг объектов в С#

какая разница, а также плюсы и минусы между

 LinkButton lb = (LinkButton)ctl;

и

 LinkButton lb = ctl as LinkButton;

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

Благодарим вас в Advance.

Ответы

Ответ 1

Первый - это явное преобразование, а второе - преобразование. Если преобразование не выполняется для ключевого слова as, оно просто вернет null вместо исключения исключения.

Это документация для каждого:

Обратите внимание, что в связанной документации выше указано, что ключевое слово as не поддерживает пользовательские преобразования. +1 к Zxpro:) Это то, что определяется пользователем:

Учебное пособие по пользовательским преобразованиям

Ответ 2

Мое обычное руководство по использованию оператора as по сравнению с прямым литье выглядит следующим образом:

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

Вышеупомянутое верно для ссылочных типов. Для типов значений (например, bool или int) as не работает. В этом случае вам нужно будет использовать проверку is для выполнения "безопасного приведения", например:

int y;
if (x is int)
{
    y = (int)x;
}
else
{
    // ...
}

Я не рекомендую пытаться поймать InvalidCastException, так как это обычно является признаком ошибки программиста. Вместо этого используйте приведенное выше руководство.

Ответ 3

Я считаю, что кастинг с использованием первого метода генерирует исключение, если он не может корректно использовать объект (пытается использовать неверный тип), тогда как использование ключевого слова as просто устанавливает переменную в значение null, если она не может быть выполнена это правильно.

Итак, убедитесь, что, если вы используете ключевое слово cast как ключевое слово, вы проверяете

if(lb == null)
    return null; // or throw new Exception()

и если вы используете cast(), вы окружаете его с помощью

try
{
    LinkButton lb = (LinkButton)ctl;
}
catch(InvalidCastException ex)
{
    //TODO: Handle Exception
}

Ответ 4

Второй называется безопасным литом, который вместо исключения исключения ставит "нуль" в вашу переменную. Поэтому он НЕ работает нормально, но устанавливает LinkButton lb в null