Кастинг с «как», а не (<T>)? - PullRequest
3 голосов
/ 10 февраля 2012

Я читал о SharePoint 2010 для работы и заметил, что многие примеры кода, с которыми я сталкиваюсь, от книг до обучающих видеороликов, представляют собой объекты SharePoint способом, который я никогда не знал, существовал в C # (и думал, что это VB-эксклюзив):

SPWeb web = properties.Feature.Parent as SPWeb;

Я так привык к кастингу (за пределами VB) таким образом (SPWeb)properties.Feature.Parent, и мне было просто любопытно, была ли какая-то конкретная причина, по которой большинство пьес в SharePoint I 'мы столкнулись с использованием обозначения VB-esque.

Ответы [ 5 ]

6 голосов
/ 10 февраля 2012

as называется оператором безопасного приведения в C #.Существует семантическая разница между этим и обычным исполнением.Безопасное приведение не вызовет исключения, если тип не может быть приведен;он вернет ноль.Нормальное приведение бросает InvalidCastException, если тип не может быть приведен.

Другими словами, этот код присваивает null if Parent, если не типа SPWeb:

SPWeb web = properties.Feature.Parent as SPWeb;

В то время как другойверсия выбрасывается, если Parent имеет неправильный тип:

SPWeb web = (SPWeb)properties.Feature.Parent;

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

Это также объясняется в этой более длинной статье о MSDN .

Кстати,эквивалентный оператор в VB равен TryCast (против DirectCast).

2 голосов
/ 10 февраля 2012
obj as T

является синтаксическим сахаром для

obj is T ? (T)obj : null

Таким образом, это «безопасное» приведение.Однако в теории это занимает больше времени.Таким образом, вы должны использовать обычное приведение, если только вы не хотите иметь значение null, если объект не относится к ожидаемому типу.Чаще вам лучше справиться с этим вручную:

if (!(obj is T))
{
    // Handle the case where obj is of an unexpected type.
}

T tobj = (T)obj;
1 голос
/ 10 февраля 2012

Если приведение завершается неудачно, переменная, назначенная ей, становится нулевой, а не генерирует исключение 'InvalidCastException'

1 голос
/ 10 февраля 2012

«as» безопаснее, чем (cast), так как он будет возвращать значение данного типа или ноль.Вы обнаружите, что следующая строка будет (или должна) проверять на нулевое значение.

1 голос
/ 10 февраля 2012

Использование ключевого слова в качестве задает для переменной web значение null, если родительский тип не относится к типу SPWeb.

Как и в случае, когда явное приведение вызовет исключениеесли родитель не относится к типу SPWeb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...