C#keywork的常见和不常见的使用模式是什么?我最近用它来计算类型化数组中已使用单元格的数量,(仍然在xsd生成的类中停留在底部,因为xsd2code在IETF设计的模式中存在许多问题,因此没有泛型)。
还提供了其他常见且更重要的常用用法模式。
答案 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你最终还是需要执行强制转换。