2012-02-13 56 views
2

如果你正在做一些微不足道的事情,如果成功获得奖励但可能会失败,并且你不想使用try/catch来计算间接费用,那么关键字as和test for null可以在语义上替代try/catch吗?as关键字可以替换try/catch块吗?

var item = new CreateItem(filename) as Item; 
if (item != null) { 
    ItemList.Add(item); 
} 
+0

你期望抛出什么异常? – Steven 2012-02-13 10:55:43

+0

我会说你会得到相同的/预期的行为,所以去吧。 – 2012-02-13 10:56:51

+0

我认为他正在寻找InvalidCastException,如果他没有使用“as”关键字 – 2012-02-13 10:58:16

回答

3

这取决于你想要捕捉什么样的错误。我会考虑使用相同的模式,int.TryParse等等 - 我不会使用as在这种情况下,个人的看法:

Item item; 
if (TryCreateItem(filename, out item)) 
{ 
    // Use it 
} 
else 
{ 
    // Don't 
} 

或者你可以只是TryCreateItem返回NULL如果失败:

Item item = TryCreateItem(); 
if (item != null) 
{ 
} 

as实际上用于所评估的表达式的执行时间类型可能是是所需类型的情况,但它是可能是不同的类型。

+0

谢谢,这阐明了我对正确使用as关键字的理解。 – 2012-02-13 11:13:44

1

如果你的构造函数不能抛出任何其他异常,那么是的。

2

不是在这种情况下,没有。构造函数将会成功,并且您将成功创建一个CreateItem,或者如果出现错误,将抛出异常,并且您将不得不在try/catch块中处理它。

如果你真的不想使用异常,创建Initialize方法:

CreateItem item = new CreateItem(filename); // this throws no exceptions 
bool initialized = item.Initialize();   // this returns true if intialize succeeded, false if something went wrong 
if (initialized) { 
    // stuff 
} 
0

对于空指针异常的上投确保可将特定问题。但是如果CreateItem抛出一个异常,你的应用程序将不幸死亡。

+0

它在c#中被称为'NullReferenceException' – 2012-02-13 10:57:35

0

我不认为这是个好主意。 as关键字具有不同的含义,虽然它是执行显式强制转换和捕捉异常的不错选择,但它不是一个好的通用流量控制机制。

而不是使用as,只需让你的方法返回null并检查它。你不需要假冒铸造。

0

当允许转换失败时,您可以使用as关键字。否则,您需要使用(Item)new CreateItem(filename)

因此,您可以用as/null检查替换try/catch,但请记住除NullReferenceException外还有更多类型的例外。也许你仍然想赶上其他异常类型。

1

try在.NET中相当高效(如果实际上抛出了异常并且catch块会发挥作用,则会产生更多的开销),因此您不必过于担心try块。

此外,as关键字仅在投射失败时通过返回null来避免例外。如果CreateItem引发异常,您仍然需要处理它。所以在你的情况下,关键字as并不真正取代try/catch。
关键字as不是替换异常处理。这只是为了铸造,可能会失败。

0

如果您的块在CreateItem的情况下用于捕获InvalidCastException没有返回Item实例,则可以将其替换为您的“as”代码以实现相同目的。

如果您的块用于捕获其他异常,那么答案是否定的。