使用'As'进行转换而不是(<T>)?

3
我一直在为工作阅读有关SharePoint 2010的资料,我发现很多书籍和教学视频中的代码示例都以一种我不知道C#中存在的方式转换SharePoint对象(我认为这是VB专属的): SPWeb web = properties.Feature.Parent as SPWeb; 我习惯了使用这种转换方式(除了VB之外),(SPWeb)properties.Feature.Parent,只是好奇为什么我遇到的大多数关于SharePoint的文章都使用类似VB的转换符号。

这个问题和Sharepoint实际上没有任何关系,您可能需要重新标记。我添加了C#标签。 - driis
谢谢,这是我见过的唯一出现的地方,所以我认为这只是SharePoint的最佳实践。 - EHorodyski
1
请问"Casting vs. using the 'as' keyword in the CLR"这篇文章的内容是什么呢? - Simen Echholt
1
在处理SharePoint的IDisposable类型时,您还需要非常小心。有些情况下,它会返回您不应该释放的内容。因此,在编写针对SharePoint的代码时,请注意“using”。 - Chriseyre2000
5个回答

6
在C#中,as被称为安全转换运算符。它与普通转换之间存在语义差异。如果类型无法转换,安全转换不会抛出异常,而是返回null。普通转换在类型无法转换时会抛出InvalidCastException异常。
换句话说,如果Parent不是SPWeb类型,那么这段代码将赋值为null
SPWeb web = properties.Feature.Parent as SPWeb;

另一个版本会抛出异常,如果父级不是正确的类型:

SPWeb web = (SPWeb)properties.Feature.Parent;
as运算符在你不确定一个对象能否转换成所需类型时非常有用-在这种情况下,通常使用as,然后检查是否为空。由于值类型不能为null,因此as仅适用于引用类型。

这也在MSDN上的这篇较长文章中得到了解释。

顺便提一下,VB中的等效运算符是TryCast(相对于DirectCast)。


谢谢,这似乎是那些应该在警告标签上的晦涩之一! - EHorodyski
需要注意的是,as 只是语法糖。 - Zenexer

2
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

使用as关键字,如果父级不是SPWeb类型,则将变量web设置为null。

而显式转换会在父级不是SPWeb类型时抛出异常。


1
"

"as"比(cast)更安全,因为它会返回一个给定类型的值或null。您会发现以下代码行将测试是否为null。

"

1

如果强制转换失败,被赋值的变量将变为 null,而不是抛出异常 'InvalidCastException'。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接