我想知道为C#转换对象的更好方法是什么:
MyClassName test = (MyClassName)object;
MyClassName test = object as MyClassName;
我已经知道,如果你做第一种方式,你得到一个例外,第二种方式它将test设置为null。但是,我想知道为什么一个在另一个?我看到第一种方式很多,但我喜欢第二种方式,因为那时我可以检查空...
如果没有“更好的方式”,那么使用这种方式的指导方针是什么?
答案 0 :(得分:8)
不是任何官方指南,但这是我如何做的。
如果您确实想要异常(即您认为该对象永远不会是MyClassName
的类型),请使用显式强制转换。示例(WinForms):
private void checkbox_CheckedChanged(object sender, EventArgs e) {
// We've hooked up this event only to CheckBox controls, so:
CheckBox checkbox = (CheckBox)sender;
// ...
}
如果您想要优雅地处理非MyClassName
的类型,请使用as
关键字。
答案 1 :(得分:1)
请注意,as
仅适用于参考类型。如果您需要取消装箱值类型,那么您必须使用C风格的演员。
答案 2 :(得分:0)
嗯,有一个简单的理由使用
as
关键字(使用括号过度转换):这个 是因为as
运算符没有 失败时抛出异常但是 而是用null
填充变量。 检查值是否为null 检查代码是否有效。请注意,在现实世界中,你会 想要围绕的异常处理 整块,供用户选择 错误的dll类型或访问它 被拒绝,或者......好吧,你得到了 图片。这意味着你可以自由 使用括号来投射 - 但这是 在我看来,一个更优雅的方法 做你想知道的事情 如果成功或失败。
答案 3 :(得分:0)
如您所说,使用as
关键字更安全,如果您不能100%确定要尝试投射的对象的类型,则可以使用该关键字。相反,如果您希望在转换失败时发生异常,请使用(cast)
方法。但是,如果您还使用is
,则as
会变得多余。例如,以下代码非常常见:
MyClass mc;
if (someObject is MyClass)
{
mc = (MyClass)someObject;
}
答案 4 :(得分:0)
如果您知道对象是MyClassName,那么使用第一种方法(直接转换)。如果您不确定,请使用第二种方法并检查null或在直接投射前使用is
检查类型:
if (obj is MyClassName)
{
MyClassName test = (MyClassName)obj;
}
答案 5 :(得分:0)
查看Prefix-casting vs As-Casting
上的这篇文章作者称前缀为“Reliable Casting”,并且为“快速铸造”。
他有几个很好的例子,说明何时使用每个,以及快速并不总是更好的原因。希望这有帮助!