欢迎光临
我们一直在努力

枚举器模式(Enumerator pattern)-.NET教程,Asp.Net开发

建站超值云服务器,限时71元/月

如何使用枚举器模式(enumerator pattern):

1、  如果你要实现ienumerable.getenumerator,你也要实现一个getenumerator方法的非虚方法版本。你的枚举器类的ienumerable.getenumerator方法应该调用这个非虚方法。如下所示应该返回一个内嵌的枚举器结构:

·                           class myclass : ienumerable

·                           {

·                             // non-virtual implementation for your custom collection

·                             public myenumerator getenumerator() {

·                               return new myenumerator(this); // return nested public struct

·                             }

·                           // ienumerator implementation

·                             public ienumerator.getenumerator() {

·                               return getenumerator();//call the non-interface method

·                             }

·                           }

如果你的类已经显示地提供了非虚的getenumerator方法,那么foreach语句就会调用这个非虚的getenumerator方法。否则,它会调用ienumerable.getenumerator方法,如果你的类实现了ienumerable接口。调用一个非虚方法比通过接口调用一个虚方法要更有效。

2、  在枚举器结构中显示的实现ienumerator.current属性。.net的实现类在实现时会使得该属性返回一个system.object对象,而不是一个强类型的对象。这会存在类型转换开销。通过在你的current属性中返回一个强类型对象或者精确的值类型而不是system.object,可以避免类型转换的开销。因为你已经显示地实现了一个非虚地getenumerator方法(不是ienumerable.getenumerator方法),clr能够直接调用enumerator.current属性,而不是调用ienumerator.current属性,因此可以直接获取所期待的数据,还能避免类型转换和装箱操作的开销。而减少虚方法调用,可以利用方法的内联了。你的实现应该如下:

// custom property in your class

//call this property to avoid the boxing or casting overhead

public myvaluetype current {

  myvaluetype obj = new myvaluetype();

  // the obj fields are populated here

  return obj;       

}

// explicit member implementation

object ienumerator.current {

get { return current} // call the non-interface property to avoid casting

}

注:枚举器模式只有当性能是关键时才适用。

下面的示例代码展示了枚举器模式:

public class  itemtypecollection: ienumerable

{

   public struct myenumerator : ienumerator

   {

      public itemtype current { get {… } }

      object ienumerator.current { get { return current; } }

      public bool movenext() { … }

      …   }

   public myenumerator getenumerator() { … }

   ienumerator ienumerable.getenumerator() { … }

   …}

要利用jit的内联方式,应该避免在你的集合类中使用虚方法,除非你确实需要扩展。同时,在current属性的实现中返回当前值来允许使用内联,或者使用一个字段。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 枚举器模式(Enumerator pattern)-.NET教程,Asp.Net开发
分享到: 更多 (0)