使用'As'而不是(<t>)进行投射?</t>

时间:2012-02-09 21:20:37

标签: c# sharepoint sharepoint-2010

我一直在阅读SharePoint 2010的工作,我注意到我从书籍到教学视频遇到的许多代码示例都是以我从未在C#中存在过的方式呈现SharePoint对象(并且认为是VB独家):

SPWeb web = properties.Feature.Parent as SPWeb;

我习惯于以这种方式({1}}之外的方式进行转换(如果有任何特殊原因)我曾经遇到过使用VB-esque强制转换符号的大部分内容。

5 个答案:

答案 0 :(得分:6)

as在C#中被称为安全强制转换运算符。这与正常演员之间存在语义差异。如果类型无法转换,安全转换将不会抛出异常;它将返回null。如果无法转换类型,则正常投射会抛出InvalidCastException

换句话说,如果父类型不是SPWeb类型,则此代码会分配null

SPWeb web = properties.Feature.Parent as SPWeb;

如果Parent的类型不正确,则抛出另一个版本:

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

如果您不确定某个对象是否可以转换为所需类型,则as运算符非常有用 - 在这种情况下,通常使用as然后检查空值。 as仅适用于引用类型,因为值类型不能为空。

this longer article on MSDN中也对此进行了解释。

顺便说一句,VB中的等效运算符是TryCast(与DirectCast对比。)

答案 1 :(得分: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;

答案 2 :(得分:1)

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

如果Parent不是SPWeb类型,那么显式转换将抛出异常。

答案 3 :(得分:1)

“as”比(强制转换)更安全,因为它将返回给定类型的值或null。 您会发现以下行将(或应该)测试null。

答案 4 :(得分:1)

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

相关问题