考虑以下代码:

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
}

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


当前回答

当试图获取任何(任何类型)可能为空的字符串表示时,我更喜欢下面的代码行。它很紧凑,它调用ToString(),并正确处理空值。如果o为空,则s将包含String.Empty。

String s = String.Concat(o);

其他回答

string s=(string)o;在需要时使用肯定是另一回事。字符串s=o作为字符串;当某事物可能是另一事物时使用事情string s=o.ToString();当你不在乎什么时使用是的,但你只想使用可用字符串表示。

“as”基于“is”,这是一个关键字,用于在运行时检查对象是否与polimorphyly兼容(基本上,如果可以进行强制转换),如果检查失败,则返回null。

这两者是等价的:

使用“as”:

string s = o as string;

使用“is”:

if(o is string) 
    s = o;
else
    s = null;

相反,c样式转换也在运行时进行,但如果无法进行转换,则会引发异常。

只是为了补充一个重要的事实:

“as”关键字仅适用于引用类型。您不能执行以下操作:

// I swear i is an int
int number = i as int;

在这种情况下,你必须使用铸造。

“(string)o”将导致InvalidCastException,因为没有直接强制转换。

“o as string”将导致s为空引用,而不是引发异常。

“o.ToString()”本身并不是任何类型的强制转换,它是一个由对象实现的方法,因此以某种方式由.net中的每个类实现,这些类对它所调用的类的实例“做一些事情”并返回字符串。

不要忘记,对于转换为字符串,还有Convert.ToString(someType instanceOfThatType),其中someType是一组类型之一,本质上是框架基类型。

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

obj.GetType().IsInstanceOfType(otherObj)

当试图获取任何(任何类型)可能为空的字符串表示时,我更喜欢下面的代码行。它很紧凑,它调用ToString(),并正确处理空值。如果o为空,则s将包含String.Empty。

String s = String.Concat(o);