当两者完全相同时,从一个对象到另一个类的转换是否会失败?

时间:2013-03-25 15:22:59

标签: c#

如果我有以下代码

object o = new Building(4, "something");

我尝试以下

if(o.GetType() == typeof(Building))
    Building buildingCast = o as Building;

可能出现什么问题?我想确保buildingCast从一个有问题的演员表中永远不会为空。有什么方法可以让演员失败吗?甚至有些模糊不清的东西?

我问的原因是我正在清理一个测试项目,我正在尝试清除多余的代码。对buildingCast的检查可能为空...

if(buildingCast == null)
    etc

...但我们无法访问if语句中的代码。

5 个答案:

答案 0 :(得分:4)

不要为了重构而重构。如果您连续有以下代码行

object o = new Building(4, "something");
Building c = o as Building;

然后务必将其改为

Building o = new Building(4, "something");

但如果您有类似

的内容
public void SomeMethod(object o)
{
   //you absolutely need a sanity check here
   Building c = o as Building;
   if( c == null )
      {
         //throw exception perhaps
      }

   //this can also be rewritten as
   Building b = null;
   if(o != null && o is Building)
          b = (Building)o;
   else
       //throw exception or log..etc

}

如果您尝试以下

if(o.GetType == typeof(Building))
    Building buildingCast = o as Building;

然后你创造了更多的冗余,事实上这会使代码的可读性降低很多,你必须做类似的事情

Building buildingCast = null; //to be able to use outside the if
if(o.GetType() == typeof(Building))
        buildingCast = o as Building;

//you still end up with a null here if cast fails.
//this is the EXACT procedure of the 'as' operator anyway
//which does 
Building buildingCast = o is Building ? (Building)o : (Building)null;

..当然,如果您绝对肯定,通过事先使用支票,类型是相同的,那么演员阵容永远不会失败。

答案 1 :(得分:2)

Building buildingCast = o as Building;

通常,在转换类o时会看到这种代码,而不知道它是否是正确的类型(并且能够转换为Building)或o是否为空。

然后,通常你会看到一个空检查后记。

如果您在上面看到这一点:

Building b  = new Building(4, "something");
object o = new Building(4, "something");

然后,as是多余的。

但是,如果从系统的其他部分传入o,您将无法确定,因此需要进行检查。

答案 2 :(得分:2)

如果o的实际类型可分配给Building,那么这将有效。如果实际类型不兼容,您将获得null结果。因此,如果o来自上述行以外的任何地方,您应该将支票留在那里。

如果您100%确定o属于Building类型,请将其声明为Building。如果那是不可能的,那么您需要将检查留在代码中并尽早将其转换为一个。例如,假设您通过反射实例化它,并且您知道类型,那么您应该立即强制转换它。

BTW,通过as投射已经为您执行了类型检查。如果类型不适用,则返回null

答案 3 :(得分:1)

我仔细阅读了答案,似乎没有人真正指出as不是演员,请查看http://msdn.microsoft.com/en-us/library/vstudio/cscsdfbt.aspx以获取更多信息。

引用重要部分:

  

请注意,as运算符仅执行引用转换,可空转换和装箱转换。 as运算符无法执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。

添加一些描述性(但不是100%正确)的术语,这意味着as尝试更改指针的类型,并查看是否可以看到它作为另一种类型引用的内容,但它绝不会试图调用一个铸造操作符。与低级别观点存在巨大差异。

我还想建议您查看is obj.GetType() == typeof(sometype) http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.80).aspx哪个基本上是obj甾体(并且你摆脱了问题) nullas)。

一般情况下,当"转换"时,您会使用as到界面。 {{1}}不允许强制,因此对象必须是正确类型的实现。

答案 4 :(得分:0)

这三行代码永远不会失败。

但是,可能存在这样的情况,即由于程序中的其他位置的某个错误或某个调用函数的人错误而使用不期望的参数调用函数。

因此,检查以确保达到预期效果总是好的。