读书人

关于泛型,该怎么解决

发布时间: 2012-10-20 14:12:48 作者: rapoo

关于泛型
下边的代码是我查msdn的帮助,里边代码大意知道,但是有些表达方式不懂

1.public class GenericList<T> 表示定义一个类吗? 因为以前定义类直接给一个名称, 这个还加了一个<T>,这种表达方式有些费解。

2.public IEnumerator<T> GetEnumerator() ,返回的是一个Node 类型,可是根据IEnumerator<T> 字面是一个接口,我的理解应该是public Node GetEnumerator()

请解释下

C# code
在 AddHead 方法中作为方法参数的类型。在 Node 嵌套类中作为公共方法 GetNext 和 Data 属性的返回类型。在嵌套类中作为私有成员数据的类型。注意,T 可用于 Node 嵌套类。如果使用具体类型实例化 GenericList<T>(例如,作为 GenericList<int>),则所有的 T 都将被替换为 int。// type parameter T in angle bracketspublic class GenericList<T> {    // The nested class is also generic on T    private class Node    {        // T used in non-generic constructor        public Node(T t)        {            next = null;            data = t;        }        private Node next;        public Node Next        {            get { return next; }            set { next = value; }        }                // T as private member data type        private T data;        // T as return type of property        public T Data          {            get { return data; }            set { data = value; }        }    }    private Node head;        // constructor    public GenericList()     {        head = null;    }    // T as method parameter type:    public void AddHead(T t)     {        Node n = new Node(t);        n.Next = head;        head = n;    }    public IEnumerator<T> GetEnumerator()    {        Node current = head;        while (current != null)        {            yield return current.Data;            current = current.Next;        }    }}


[解决办法]
1.public class GenericList<T> 表示定义一个类吗?

准确的说,GenericList不是一个类,而是一个能够派生出一组类的东西,应该叫“泛型类”吧,所谓的“泛型类”是一个“带参数”的类,而T就是它的参数,

其实GenericList不是一个类,但GenericList<int>就是一个类,int相当于是实参,把T给替换掉了,在GenericList内部所有出现T的地方,都替换为int,就是GenericList<int>了,你会发现,GenericList<int>确实是一个类,它有方法,属性,而且方法属性都是确定的可以编译运行的,因为它已经把T替换为int,完全确定了,

可以看得出,虽然GenericList不是一个类,但它可以“实例化”为非常多个类,比如GenericList<int>、GenericList<double>、GenericList<string>等,显而易见的好处是,你用T来写的GenericList泛型,只需要把T替换为int,double,string,就可以得多多个类,而且你无需再次写方法里的代码,

定义一个泛型,可以让你轻松获得多个类,

从另一个角度来说,如果你不用泛型,而是实现GenericList<int>、GenericList<double>、GenericList<string>等类,你会发现,除了元素的类型不同之外,这些类的代码基本完全相同,你在写重复的代码,为何把使用一个参数T来代替int,double,string等类型,这样就可以省掉重复实现,

[解决办法]
2.public IEnumerator<T> GetEnumerator() ,返回的是一个Node 类型,

你理解错了,返回的不是Node类型,而是实现了IEnumerator<T>接口的一个类实例的引用,这个类实例其实是yield return current.Data这句话创建的,或者说是c#编译器根据yield语句帮你生成了一个类,这个类从IEnumerator<T>接口中继承,

一般来说,使用迭代器你无需自己从IEnumerator<T>接口派生一个类,只需要用yield关键字,c#编译器会帮你生成这个类,并且继承IEnumerator<T>接口的方法,甚至c#编译器会帮你实现这些方法,无需你写代码实现,

这个方法返回的IEnumerator<T>接口引用完全和Node泛型类无关,它是编译器生成的,
[解决办法]
简单的说T就是指任意类型!
[解决办法]
<T>,这里的T,理解成Type,一种类型。
一般来说这个乏型就是他处理的<T>数据时,这个数据类型可变,可以是class a,也可以class b,有些时候很方便。
[解决办法]
你连为什么用都不知道,干嘛就看怎么去写了呢?等你实际用到了再看是怎么写的也不迟,这个必须自己在编码过程中体会,用到了自然就知道,用不到你也没必要去关心。
[解决办法]
探讨

你连为什么用都不知道,干嘛就看怎么去写了呢?等你实际用到了再看是怎么写的也不迟,这个必须自己在编码过程中体会,用到了自然就知道,用不到你也没必要去关心。

[解决办法]
List<T> 不算是一个具体的类,只能算是一个类的模板,具体制定了 T 类型之后才能确定为一个具体的类,比如:List<int> 和 List<string>


[解决办法]

探讨
你的观点 我不认同

做开发的平时就要注意积累,一项技术,不说完全吃透吧 大概意思得要了解吧

等正的项目需要这项技术的时候,你再去学去看,有那么多时间吗?

[解决办法]
泛型是为了能够重用数据结构 算法 一种更高层次的抽象 忽略了具体的数据类型 而只有针对数据的操作
[解决办法]
静态方法 返回值 为实现了IEnumerable的类型咯
[解决办法]
探讨

泛型我大概了解了。


疑问:
现在对于public static IEnumerable Power(int number, int exponent)这种表达方式还不太理解,原来是一个静态方法,加一个IEnumerable 又表示什么意思? 以前只知道 public 类名:接口名这种表达方式

[解决办法]
另外你给的例子很不恰当,因为它并未继承IEnumerator接口,正确的写法应该是这样:
C# code
public class GenericList<T> :IEnumerator<T>{} 

读书人网 >C#

热点推荐