(MyClassName)对象与对象为MyClassName

时间:2010-04-01 16:47:32

标签: c# .net

我想知道为C#转换对象的更好方法是什么:

MyClassName test = (MyClassName)object;

MyClassName test = object as MyClassName;

我已经知道,如果你做第一种方式,你得到一个例外,第二种方式它将test设置为null。但是,我想知道为什么一个在另一个?我看到第一种方式很多,但我喜欢第二种方式,因为那时我可以检查空...

如果没有“更好的方式”,那么使用这种方式的指导方针是什么?

6 个答案:

答案 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类型或访问它   被拒绝,或者......好吧,你得到了   图片。这意味着你可以自由   使用括号来投射 - 但这是   在我看来,一个更优雅的方法   做你想知道的事情   如果成功或失败。

来源:http://www.nullify.net/Article/181.aspx

答案 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”,并且为“快速铸造”。

他有几个很好的例子,说明何时使用每个,以及快速并不总是更好的原因。希望这有帮助!