0

如果我有以下代码

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

我尝试以下

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

会出什么问题?我想确保buildingCast有问题的演员阵容永远不会为空。有什么办法可以使演员失败吗?甚至一些晦涩难懂的东西?

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

if(buildingCast == null)
    etc

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

4

5 回答 5

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;

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

于 2013-03-25T15:34:06.047 回答
2

Building buildingCast = o as Building;

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

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

如果你在上面看到这个:

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

然后,as是多余的。

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

于 2013-03-25T15:26:47.260 回答
2

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

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

顺便说一句,cast viaas已经为您执行了类型检查。如果类型不适用,则返回null.

于 2013-03-25T15:28:22.027 回答
1

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

引用重要部分:

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

放入一些描述性(但不是 100% 正确)的术语,这意味着as尝试更改指针的类型并查看是否可以将其引用为另一种类型,但它永远不会尝试调用强制转换运算符,隐含与否。从低层次的角度来看是巨大的差异。

我还想建议你看看is这里http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.80).aspx这基本上是一个类obj.GetType() == typeof(sometype)固醇(和你摆脱存在的问题objnull

通常,您as在“转换”为界面时使用。as不允许强制,因此对象必须是正确类型的实现。

于 2013-03-25T16:09:01.703 回答
0

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

但是,在某些情况下,由于程序中其他地方的错误或有人错误地调用函数,可能会使用不期望的参数调用函数。

因此,检查以确保您得到了预期的结果总是好的。

于 2013-03-25T15:32:49.723 回答