Листинг объектов в С#
какая разница, а также плюсы и минусы между
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
Ответ 5
Обратитесь this из @Jon Skeet: Какая разница между синтаксис синтаксиса и использование оператора as?