考虑以下代码:
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
}
三种类型的施法有什么区别(好吧,第三种不是施法,但你明白了意图)。应该首选哪一种?
考虑以下代码:
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)o”将导致InvalidCastException,因为没有直接强制转换。
“o as string”将导致s为空引用,而不是引发异常。
“o.ToString()”本身并不是任何类型的强制转换,它是一个由对象实现的方法,因此以某种方式由.net中的每个类实现,这些类对它所调用的类的实例“做一些事情”并返回字符串。
不要忘记,对于转换为字符串,还有Convert.ToString(someType instanceOfThatType),其中someType是一组类型之一,本质上是框架基类型。
其他回答
“(string)o”将导致InvalidCastException,因为没有直接强制转换。
“o as string”将导致s为空引用,而不是引发异常。
“o.ToString()”本身并不是任何类型的强制转换,它是一个由对象实现的方法,因此以某种方式由.net中的每个类实现,这些类对它所调用的类的实例“做一些事情”并返回字符串。
不要忘记,对于转换为字符串,还有Convert.ToString(someType instanceOfThatType),其中someType是一组类型之一,本质上是框架基类型。
string s=(string)o;在需要时使用肯定是另一回事。字符串s=o作为字符串;当某事物可能是另一事物时使用事情string s=o.ToString();当你不在乎什么时使用是的,但你只想使用可用字符串表示。
当您使用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;
}
这不是一件大事,但它节省了代码行和变量赋值,而且可读性更强
根据本页上运行的实验:http://www.dotnetguru2.org/sebastienros/index.php/2006/02/24/cast_vs_as
(此页面有时会显示一些“非法引用者”错误,因此如果出现,请刷新)
结论是,“as”运算符通常比强制转换快。有时速度快很多倍,有时仅仅快不了几倍。
我个人认为“as”也更可读。
因此,由于它既快又“安全”(不会抛出异常),而且可能更容易阅读,我建议一直使用“as”。
string s = o as string; // 2
首选,因为它避免了双重铸造的性能损失。