考虑以下代码:
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 s=(string)o;在需要时使用肯定是另一回事。字符串s=o作为字符串;当某事物可能是另一事物时使用事情string s=o.ToString();当你不在乎什么时使用是的,但你只想使用可用字符串表示。
其他回答
string s = o as string; // 2
首选,因为它避免了双重铸造的性能损失。
如果您已经知道它可以转换为什么类型,请使用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()获取任何对象的可读字符串表示,即使它不能转换为字符串。
我想提请注意as操作员的以下细节:
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/as
注意,as运算符仅执行参考转换,可空转换和装箱转换。as运算符不能执行其他转换,例如用户定义的转换应改为使用强制转换表达式来执行。
因为没有人提到它,所以最接近instanceOf的关键字是:
obj.GetType().IsInstanceOfType(otherObj)
“(string)o”将导致InvalidCastException,因为没有直接强制转换。
“o as string”将导致s为空引用,而不是引发异常。
“o.ToString()”本身并不是任何类型的强制转换,它是一个由对象实现的方法,因此以某种方式由.net中的每个类实现,这些类对它所调用的类的实例“做一些事情”并返回字符串。
不要忘记,对于转换为字符串,还有Convert.ToString(someType instanceOfThatType),其中someType是一组类型之一,本质上是框架基类型。