[英]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.