考虑以下代码:
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 s=(string)o;在需要时使用肯定是另一回事。字符串s=o作为字符串;当某事物可能是另一事物时使用事情string s=o.ToString();当你不在乎什么时使用是的,但你只想使用可用字符串表示。
“(string)o”将导致InvalidCastException,因为没有直接强制转换。
“o as string”将导致s为空引用,而不是引发异常。
“o.ToString()”本身并不是任何类型的强制转换,它是一个由对象实现的方法,因此以某种方式由.net中的每个类实现,这些类对它所调用的类的实例“做一些事情”并返回字符串。
不要忘记,对于转换为字符串,还有Convert.ToString(someType instanceOfThatType),其中someType是一组类型之一,本质上是框架基类型。
如果我可以补充一下,所有给出的答案都很好:要直接使用字符串的方法和财产(例如ToLower),您不能编写:
(string)o.ToLower(); // won't compile
你只能写:
((string)o).ToLower();
但你可以写:
(o as string).ToLower();
as选项更可读(至少在我看来)。
当试图获取任何(任何类型)可能为空的字符串表示时,我更喜欢下面的代码行。它很紧凑,它调用ToString(),并正确处理空值。如果o为空,则s将包含String.Empty。
String s = String.Concat(o);
2可用于转换为派生类型。
假设a是动物:
b = a as Badger;
c = a as Cow;
if (b != null)
b.EatSnails();
else if (c != null)
c.EatGrass();
将得到最少的投喂。