如果你正在做一些微不足道的事情,如果成功获得奖励但可能会失败,并且你不想使用try/catch来计算间接费用,那么关键字as
和test for null可以在语义上替代try/catch吗?as关键字可以替换try/catch块吗?
var item = new CreateItem(filename) as Item;
if (item != null) {
ItemList.Add(item);
}
如果你正在做一些微不足道的事情,如果成功获得奖励但可能会失败,并且你不想使用try/catch来计算间接费用,那么关键字as
和test for null可以在语义上替代try/catch吗?as关键字可以替换try/catch块吗?
var item = new CreateItem(filename) as Item;
if (item != null) {
ItemList.Add(item);
}
这取决于你想要捕捉什么样的错误。我会考虑使用相同的模式,int.TryParse
等等 - 我不会使用as
在这种情况下,个人的看法:
Item item;
if (TryCreateItem(filename, out item))
{
// Use it
}
else
{
// Don't
}
或者你可以只是让TryCreateItem
返回NULL如果失败:
Item item = TryCreateItem();
if (item != null)
{
}
as
实际上用于所评估的表达式的执行时间类型可能是是所需类型的情况,但它是可能是不同的类型。
谢谢,这阐明了我对正确使用as关键字的理解。 – 2012-02-13 11:13:44
如果你的构造函数不能抛出任何其他异常,那么是的。
不是在这种情况下,没有。构造函数将会成功,并且您将成功创建一个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
}
对于空指针异常的上投确保可将特定问题。但是如果CreateItem抛出一个异常,你的应用程序将不幸死亡。
它在c#中被称为'NullReferenceException' – 2012-02-13 10:57:35
我不认为这是个好主意。 as
关键字具有不同的含义,虽然它是执行显式强制转换和捕捉异常的不错选择,但它不是一个好的通用流量控制机制。
而不是使用as
,只需让你的方法返回null并检查它。你不需要假冒铸造。
当允许转换失败时,您可以使用as
关键字。否则,您需要使用(Item)new CreateItem(filename)
。
因此,您可以用as/null检查替换try/catch,但请记住除NullReferenceException
外还有更多类型的例外。也许你仍然想赶上其他异常类型。
try
在.NET中相当高效(如果实际上抛出了异常并且catch
块会发挥作用,则会产生更多的开销),因此您不必过于担心try
块。
此外,as
关键字仅在投射失败时通过返回null
来避免例外。如果CreateItem
引发异常,您仍然需要处理它。所以在你的情况下,关键字as
并不真正取代try/catch。
关键字as
不是替换异常处理。这只是为了铸造,可能会失败。
如果您的块在CreateItem的情况下用于捕获InvalidCastException没有返回Item实例,则可以将其替换为您的“as”代码以实现相同目的。
如果您的块用于捕获其他异常,那么答案是否定的。
你期望抛出什么异常? – Steven 2012-02-13 10:55:43
我会说你会得到相同的/预期的行为,所以去吧。 – 2012-02-13 10:56:51
我认为他正在寻找InvalidCastException,如果他没有使用“as”关键字 – 2012-02-13 10:58:16