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

时间:2009-11-02 16:31:26

标签: c# c#-3.0

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

还提供了其他常见且更重要的常用用法模式。

5 个答案:

答案 0 :(得分:14)

'is'关键字对于确定对象是否可通过引用,装箱或拆箱转换(C#lang规范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();
}

答案 1 :(得分:6)

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

比较:

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

并且:

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

在第一种情况下:2次操作(1次检查+ 1次施法)

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

答案 2 :(得分:1)

我记不起曾经使用is。大多数情况下,如果您需要知道某个实例是否属于某种类型,则需要使用它。

所以我通常使用as或显式转换直接投射它,如果我确定它实际上属于有问题的类型。

我尝试编写不需要强制转换或查找类型信息的代码。因此,在引用类型的强制转换之前编写is当然不值得推荐。

答案 3 :(得分:0)

随着即将到来的v4而不是使用is,因为有一种不同的可能方法。

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

DoStuff(neededType o){}
DoStuff(object o){}

然而,它可能会有一个性能上升,但却具有良好的可读性

答案 4 :(得分:0)

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

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

将产生一个可以测试null的引用。否则,使用as oprator你最终还是需要执行强制转换。