不定义IEnumerable和IEnumrator接口就能使用foreach语句的方法

原创 2004年09月01日 13:27:00

大家都知道foreach语句在定义了IEnumerable的接口上工作。比如:

    string[] sArr = new string[10];<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    foreach (string s in sArr)

      Console.WriteLine(s);

 

如果没有定义IEnumerable接口,就会出现编译错误。但是这个限制也不是绝对的。按照C#语言规范,只要能满足下面的条件,就算不定义IEnumrable/IEnumrator接口也可以使用foreach语句。

1.       假定表达式具有GetEnumrator()方法。

2.        GetEnumerator()方法返回的对象定义了所有IEnumerator接口定义的方法,即
public interface IEnumerator

{      // Methods

      bool MoveNext();

      void Reset();

 

      // Properties

      object Current { get; }

}


《使用foreach简化文本文件的访问》(阅读)文中介绍的LineReader就没有声明实现IEnumerable/IEnumrator接口,但同样能在foreach语句中工作。

 

LineReader的另一个特点是GetEnumerator()方法:

   public LineReader GetEnumerator()

    {

      return this;

    }

 

没有创建一个新对象实例,而是返回自身,这样可以节省一次创建对象的开销,同时也简化了程序逻辑。缺点是,一个LineReader只能同时打开一个Enumerator,打开一个以上Enumerator时,程序运行不正确。但从LineReader运行的场景来看。我们总是按照foreach (string line in new LineReader(…))的方式使用,不会出现打开同时打开两个Enumerator,或者在多线程中使用的情况。

深入理解IEnumerable和IQueryable两接口的区别

无论是在ado.net EF或者是在其他的Linq使用中,我们经常会碰到两个重要的静态类Enumerable、Queryable,他们在System.Linq命名空间下。那么这两个类是如何定义的,又是...
  • ydm19891101
  • ydm19891101
  • 2016-03-24 13:55:58
  • 5798

实现IEnumable以迭代对象示例

using System;using System.Collections.Generic;using System.Text;using System.Collections;namespace S...
  • lianchangshuai
  • lianchangshuai
  • 2010-08-13 18:42:00
  • 1697

IEnumrable

class Beatles : IEnumerable{    protected Enumerator enumerator = new Enumerator ();    public IEnum...
  • jjjjyyyyy
  • jjjjyyyyy
  • 2009-09-28 22:19:00
  • 477

IEnumerable和IEnumrator用法

先用一个修改过的代码来演示用法,只来干的,不来稀的。 /* * Created by SharpDevelop. * User: Owner * Date: 2012-12-14 *...
  • callmeback
  • callmeback
  • 2012-12-14 15:35:35
  • 5709

能用foreach遍历访问的对象需要实现____接口或声明____方法的类型

一、答案       能用foreach遍历访问的对象需要实现IEnumerable接口或声明GetEnumerator方法的类型       注:不一定要实现IEnumerable接口,但一定要...
  • zfq18317916225
  • zfq18317916225
  • 2016-02-22 16:39:19
  • 2102

使用c++封装com的IEnum接口

使用c++封装com的IEnum接口 最近在做DirectShow的一些开发,其中总要用到连接filter之类的操作,而filter是通过com中的枚举器得到的。在c++中使用枚举器十分不方便,可以看...
  • zhuk_nir
  • zhuk_nir
  • 2005-06-21 16:06:00
  • 1748

OPC客户端开发过程整理

2013-09-02 17:01:44|  分类: window其它 |  标签:opc客户端  opc开发   |举报 |字号 订阅 OPC开发过程: 1.注册OP...
  • greston
  • greston
  • 2014-06-26 11:38:23
  • 16917

IEnumerable及IEnumerator接口

IEnumerable及IEnumerator接口 (Enumerator:枚举器; Iterator:迭代器) (一)IEnumerable接口 public interface IEnumerab...
  • Anigado1992
  • Anigado1992
  • 2015-09-18 11:26:20
  • 239

“System.Data.DataSet”不包含“GetEnumerator”的公共定义,因此 foreach 语句不能作用于“System.Data.DataSet”类型的变量

解决方案:
  • kay_1010
  • kay_1010
  • 2013-12-26 15:44:41
  • 3359

不定义IEnumerable和IEnumrator接口就能使用foreach语句的方法

大家都知道foreach语句在定义了IEnumerable的接口上工作。比如:    string[] sArr = new string[10];    foreach (string s in s...
  • redforks
  • redforks
  • 2004-09-01 13:27:00
  • 1383
收藏助手
不良信息举报
您举报文章:不定义IEnumerable和IEnumrator接口就能使用foreach语句的方法
举报原因:
原因补充:

(最多只允许输入30个字)