请考虑以下代码:
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;
当某物绝对应该是string s = o as string;
当某事可能是另一string s = o.ToString();
当您不关心它是什么网友回答:
string s = (string)o; // 1
如果不是 .否则,将分配给 ,即使 是 。o
string
o
s
o
null
string s = o as string; // 2
分配给 if 不是 或 if 是 。因此,不能将其与值类型一起使用(在这种情况下,运算符永远不会返回)。否则,将分配给 。null
s
o
string
o
null
null
o
s
string s = o.ToString(); // 3
导致空引用异常,如果为 。分配返回的任何内容,无论是什么类型。o
null
o.ToString()
s
o
对于大多数转化,请使用 1 – 它简单明了。我倾向于几乎从不使用 2,因为如果某些东西的类型不正确,我通常希望发生异常。我只看到需要这种返回空类型的功能,这些函数使用使用错误代码的糟糕设计的库(例如,返回 null = 错误,而不是使用异常)。
3 不是强制转换,只是一个方法调用。当您需要非字符串对象的字符串表示形式时,请使用它。
网友回答:
这实际上取决于您是否知道是否是字符串以及您想用它做什么。如果你的评论意味着这真的是一个字符串,我更喜欢直接的演员——它不太可能失败。o
o
(string)o
使用直接强制转换的最大优点是,当它失败时,你会得到一个 InvalidCastException,它几乎可以告诉你出了什么问题。
使用运算符,if 不是字符串,设置为 ,如果您不确定并想要测试,这将很方便:as
o
s
null
s
string s = o as string;
if ( s == null )
{
// well that's not good!
gotoPlanB();
}
但是,如果不执行该测试,则稍后将使用并引发 NullReferenceException。这些往往更常见,一旦它们在野外发生,就更难追踪,因为几乎每行都取消引用一个变量并可能抛出一个变量。另一方面,如果您尝试强制转换为值类型(任何基元或 DateTime 等结构),则必须使用直接强制转换 – 这将不起作用。s
as
在转换为字符串的特殊情况下,每个对象都有一个 ,因此如果不是 null,并且您认为该方法可能会执行您想要的操作,则您的第三个方法可能没问题。ToString
o
ToString
模板简介:该模板名称为【直接转换与“as”运算符?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。