不定义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,或者在多线程中使用的情况。

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

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

C#中foreach的实现原理

在探讨foreach如何内部如何实现这个问题之前,我们需要理解两个C#里边的接口,IEnumerable 与 IEnumerator. 在C#里边的遍历集合时用到的相关类中,IEnumerable是最...
  • dk_0520
  • dk_0520
  • 2017年04月01日 17:57
  • 1709

Java中接口定义及实现接口的抽象方法

1.接口 (1)接口定义前默认修饰符为public。 (2)接口中变量默认修饰符为public static final。 (3)接口中方法默认的访问权限为public。 实例 public int...
  • hellorichen
  • hellorichen
  • 2016年09月13日 14:55
  • 2745

详解C#接口以及实现/C# 接口中不能定义字段

C#接口是什么呢?C#接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语言的限制(理论上)。C#接口可以从多个基接口继承,而类...
  • zzy7075
  • zzy7075
  • 2015年03月09日 09:59
  • 8651

Java中接口中的方法定义规则

Java接口中的方法定义规则最近在做某个公司校招的笔试的时候,遇到了如下一个题:题目如下:(多选题)请选择以下接口定义正确的方法()A:public static void main (String[...
  • u010412719
  • u010412719
  • 2016年09月14日 11:24
  • 6158

为什么接口中只能定义常量?

学习完接口后,知道了接口中只能定义常量,即使你的代码是这样写的:public int a,底层语言也会默认加上public static final int a转为常量,那么这是为什么呢? 我们都知...
  • fightfaith
  • fightfaith
  • 2015年09月25日 11:52
  • 3880

C#接口的定义、特点、实现和应用

C#接口(interface)的掌握对我们开发有什么作用呢?C#接口的使用能够使我们的程序有什么改进?那么我们首先我们来看看C#接口特点以及具体的实例使用分析: C#接口特点1:都是“虚的”不能...
  • ueszx
  • ueszx
  • 2016年04月13日 00:21
  • 1662

C#之接口定义与实现

今天我来讲一下关于oop中接口方面的知识,希望
  • u010158267
  • u010158267
  • 2014年04月04日 20:05
  • 5565

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

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

概述C#定义接口成员

从技术上讲,接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。 C#定义接口成员 接口可以包含一个和多个成员,这些成员可以是方法、属性、索引指示器和事件,但不能是...
  • zzy7075
  • zzy7075
  • 2015年04月10日 13:55
  • 857
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:不定义IEnumerable和IEnumrator接口就能使用foreach语句的方法
举报原因:
原因补充:

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