代码之家  ›  专栏  ›  技术社区  ›  scope_creep

C#“is”关键字的使用模式

  •  6
  • scope_creep  · 技术社区  · 15 年前

    C#keywork“is”的常见和不常见的使用模式是什么。我最近使用它来计算类型化数组中使用的单元格数量(仍然停留在xsd生成类的底部,因为xsd2code在IETF设计的模式中有许多问题,因此没有泛型)。

    5 回复  |  直到 15 年前
        1
  •  14
  •   JaredPar    15 年前

    “is”关键字可用于确定对象是否可通过引用、装箱或拆箱转换转换为类型(C#lang spec 7.9.10)。它与“as”类似,只是它实际上不进行转换,只要有可能就返回。

    if ( o is SomeType ) {
      TakeSomeAction();
    }
    

    如果对该值具有指定类型的引用是有用的,那么使用“as”运算符更有效。

    // Wrong
    if ( o is SomeType ) {
      SomeType st = (SomeType)o;
      st.TakeSomeAction();
    }
    
    // Right
    SomeType st = o as SomeType;
    if ( st != null ) {
      st.TakeSomeAction();
    }
    
        2
  •  6
  •   Thomas Levesque    15 年前

    事实上,我几乎从不使用它。当我需要它时,通常是因为我要将值强制转换为所需的类型,所以我更喜欢使用as。

    比较:

    if (x is MyType)
    {
        MyType y = (MyType)x;
        ...
    }
    

    以及:

    MyType y = x as MyType;
    if (y != null)
    {
        ...
    }
    

    在第一种情况下:2次操作(1次类型检查+1次强制转换)

    在第二种情况下:1次操作(类型检查+一次性铸造)

        3
  •  1
  •   Stefan Steinegger    15 年前

    我不记得曾经用过 is

    所以我通常直接用 as 或者显式强制转换,如果我确信它实际上是有问题的类型。

    我尝试编写不需要多次强制转换或查找类型信息的代码。这么写 在引用类型强制转换之前,当然不推荐使用。

        4
  •  0
  •   Rune FS    15 年前

    使用即将推出的v4而不是使用is,因为有一种不同的可能方法。

    void somemethod(dynamic o)
    {
    DoStuff(o);
    }
    
    DoStuff(neededType o){}
    DoStuff(object o){}
    

    然而,这可能会有一个性能的打击,但有很好的可读性

        5
  •  0
  •   Brett Ryan    15 年前

    这取决于您是否需要对类型的引用,如果 is 给定类型的类型。如果是,则应使用`as keyworkd。

    MyObject mo = obj as MyObject;
    if (mo == null) {
        // do something.
    } else {
        // do something else.
    }
    

    as 您“”最终被要求执行强制转换。

    推荐文章