考虑以下代码:

void Handler(object o, EventArgs e)
{
   // I swear o is a string
   string s = (string)o; // 1
   //-OR-
   string s = o as string; // 2
   // -OR-
   string s = o.ToString(); // 3
}

三种类型的施法有什么区别(好吧,第三种不是施法,但你明白了意图)。应该首选哪一种?


当前回答

string s = o as string; // 2

首选,因为它避免了双重铸造的性能损失。

其他回答

当您使用FindControl方法时,as关键字在asp.net中很好。

Hyperlink link = this.FindControl("linkid") as Hyperlink;
if (link != null)
{
     ...
}

这意味着您可以对类型化变量进行操作,而不必像直接转换那样从对象转换它:

object linkObj = this.FindControl("linkid");
if (link != null)
{
     Hyperlink link = (Hyperlink)linkObj;
}

这不是一件大事,但它节省了代码行和变量赋值,而且可读性更强

我想提请注意as操作员的以下细节:

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as

注意,as运算符仅执行参考转换,可空转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换应改为使用强制转换表达式来执行。

因为没有人提到它,所以最接近instanceOf的关键字是:

obj.GetType().IsInstanceOfType(otherObj)

如果您已经知道它可以转换为什么类型,请使用C样式转换:

var o = (string) iKnowThisIsAString; 

注意,只有使用C样式转换才能执行显式类型强制。

如果您不知道它是否是所需的类型,如果是,您将使用它,请使用关键字:

var s = o as string;
if (s != null) return s.Replace("_","-");

//or for early return:
if (s==null) return;

注意,as不会调用任何类型转换运算符。仅当对象不为空且本机为指定类型时,它才为非空。

使用ToString()获取任何对象的可读字符串表示,即使它不能转换为字符串。

string s = o as string; // 2

首选,因为它避免了双重铸造的性能损失。