繁体   English   中英

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

[英]C# Usage patterns for the “is” keyword

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

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

'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();
}

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

相比 :

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

而且:

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

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

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

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

因此,如果我确定它实际上是有问题的类型,我通常会使用as或显式转换直接转换它。

我尝试编写不需要强制转换或查找类型信息的代码。 所以写作is在引用类型的强制转换之前肯定不值得推荐的。

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

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

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

然而,这可能会有一个演奏命中,但可以提供良好的可读性

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM