代码分析一:泛型与接口,枚举

    VS有一个解决方案的概念,这样诸多的工程可以放在同一个解决方案之中,方便管理,因为初学C#,本来以为只要我将学习的代码放到解决方案中就可以了,但是,随着代码量的增加,之前的例子还是石沉大海,也没很多机会再回头看看,所以,就把一些很有意思的代码贴到博客里面,强制自己分析一遍,加深理解和印象,也保留了学习的足迹。--2013.12.15.

    之前理解了接口的运行机制,但是泛型接口一度让我有点糊涂,今天看到C# In Depth里面展示了一个小例子,就是说接口以及foreach的,看完这个例子,发现还是挺有意思的:

   1 对于扩展接口的实现,访问限制符号是没有意义的

    2 泛型接口扩展了接口,实际使用时,其实是一种限制

    3 IEnumerable是对于IEnumerator的封装,并且两者的泛型申明都是对基本接口的扩展。


IEnumerable<T>的实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//IEnumberator只隶属于Collections这一级
using System.Collections;

namespace GenericTest20131211
{
   
    class NewContinuingEnumber
    {
        //class NewContinuingEnumberBase : IDisposable
        //{
        //    public void Dispose()
        //    { }
        //}
        class EnumberableImpl :IEnumerable<int>, IDisposable
        {
            //Implement IEnumerator<T> GetEnumerator(),实际上IEnumerable<T>是
            //IEnumerator<T>的一个wrapper,先实现IEnumerator<T>,既然是封装类
            //IEnumerator<T> GetEnumerator() 只能从对象中获取接口了
            public IEnumerator<int> GetEnumerator()
            {
                return (new EnumeratorImpl()) as IEnumerator<int>; 
            }
            //接下来尝试实现IEnumerator.IEnumerator GetEnumerator(),由于IEnumerable<T>只是对
            //IEnumerable的扩展和类型限制,所以,其实返回一个IEnumerator<int>转化为IEnumerator即可
            IEnumerator IEnumerable.GetEnumerator()
            {
                return this.GetEnumerator() as IEnumerator;
            }
            public void Dispose() { }
        }

IEnumerator的实现:

      class EnumeratorImpl : IEnumerator<int>
        {
            int current = -1;
            //IDisposable.Dispose;
            public void Dispose() { }
            //实现属性的访问方法
            public int Current { get { return current; } }
            //再显式的实现IEnumerator的接口,泛型和非凡性的奇怪组合,泛型虽然是一个开放类型
            //但是指定了类型,相对于单纯的接口来说,泛型的最终使用是一种限制

            //IEnumerator的属性实现,object Current,但是需要指明接口
            object IEnumerator.Current { get { return Current; } }
            public bool MoveNext() 
            {
                current++;
                return current < 10;
            }
            public void Reset()
            {
                current = -1;
            }
        }

测试程序:

       class TestEnumImpl
        {
            public static void Test()
            {
                //这个测试说明了foreach的工作原理,获取一个IEnumerable接口,然后遍历其中的对象
                //获取一个结合的包装对象,然后就可以通过foreach遍历了
                using (EnumberableImpl enumer = new EnumberableImpl())
                {
                    IEnumerable<int> enumerable = enumer as IEnumerable<int>;
                    {
                        foreach (int num in enumerable)
                        {
                            Console.WriteLine(num.ToString());
                        }
                    }
                }

            }
        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值