关于泛型

wrost 2012-09-05 01:47:02
下边的代码是我查msdn的帮助,里边代码大意知道,但是有些表达方式不懂

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

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

请解释下



在 AddHead 方法中作为方法参数的类型。

在 Node 嵌套类中作为公共方法 GetNext 和 Data 属性的返回类型。

在嵌套类中作为私有成员数据的类型。

注意,T 可用于 Node 嵌套类。如果使用具体类型实例化 GenericList<T>(例如,作为 GenericList<int>),则所有的 T 都将被替换为 int。

// type parameter T in angle brackets
public 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;
}
}
}


...全文
239 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xboxeer 2012-09-06
  • 打赏
  • 举报
回复
泛型是为了能够重用数据结构 算法 一种更高层次的抽象 忽略了具体的数据类型 而只有针对数据的操作
wrost 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
2.public IEnumerator<T> GetEnumerator() ,返回的是一个Node 类型,

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

根据大哥所说,我查了下MSDN,看了下边例子,对yield理解了一些
如果没有这个yield关键字,result必须在静态方法运行完后返回仅有的一个值;加上yield return result后,每次while循环都返回一个值。

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


public class List
{
//using System.Collections;
public static IEnumerable Power(int number, int exponent)
{
int counter = 0;
int result = 1;
while (counter++ < exponent)
{
result = result * number;
yield return result;
}
}

static void Main()
{
// Display powers of 2 up to the exponent 8:
foreach (int i in Power(2, 8))
{
Console.Write("{0} ", i);
}
}
}
/*
Output:
2 4 8 16 32 64 128 256
*/






wrost 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 9 楼 的回复:
你的观点 我不认同

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

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

那我反过来问你,现在的技术更新那么快,有那么多技术要学,你都去学了储备来得及吗?我明明是让他不要急着去写,而不是不要去了解。所谓的了解,就是只要知道有这么一个东西就可以了,而不需要自己去创造,用别人写好……
[/Quote]

大家都是好意,只是思路、角度不一样,谢谢2位。

我是要用Linq,因为里边有这些内容,所以要看看。

关于迭代器还是很模糊啊

qldsrx 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
你的观点 我不认同

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

等正的项目需要这项技术的时候,你再去学去看,有那么多时间吗?
[/Quote]
那我反过来问你,现在的技术更新那么快,有那么多技术要学,你都去学了储备来得及吗?我明明是让他不要急着去写,而不是不要去了解。所谓的了解,就是只要知道有这么一个东西就可以了,而不需要自己去创造,用别人写好的不代表自己也要会写一个类似的。
youzelin 2012-09-06
  • 打赏
  • 举报
回复
List<T> 不算是一个具体的类,只能算是一个类的模板,具体制定了 T 类型之后才能确定为一个具体的类,比如:List<int> 和 List<string>
二当家 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

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

你的观点 我不认同

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

等正的项目需要这项技术的时候,你再去学去看,有那么多时间吗?
qldsrx 2012-09-06
  • 打赏
  • 举报
回复
你连为什么用都不知道,干嘛就看怎么去写了呢?等你实际用到了再看是怎么写的也不迟,这个必须自己在编码过程中体会,用到了自然就知道,用不到你也没必要去关心。
wrost 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1.public class GenericList<T> 表示定义一个类吗?

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

其实GenericList不是一个类,但GenericList<int>就是一个类,int相当于是实参,把T给替换掉了,在GenericList内部所有出……
[/Quote]

这么一说,明白很多,为什么用“泛型”
qldsrx 2012-09-06
  • 打赏
  • 举报
回复
另外你给的例子很不恰当,因为它并未继承IEnumerator接口,正确的写法应该是这样:
public class GenericList<T> :IEnumerator<T>
{

}
qldsrx 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

泛型我大概了解了。


疑问:
现在对于public static IEnumerable Power(int number, int exponent)这种表达方式还不太理解,原来是一个静态方法,加一个IEnumerable 又表示什么意思? 以前只知道 public 类名:接口名这种表达方式
[/Quote]
不知道你有没有用过foreach循环,没有的话就先看看什么是foreach。
要支持使用foreach来遍历的对象,都必须是继承IEnumerator接口的对象,数组(Array)虽然定义的时候没有继承IEnumerator,但是运行时提供了IEnumerator支持。
它这里返回IEnumerator接口的对象,其实目的就是为了提供foreach遍历支持。
xboxeer 2012-09-06
  • 打赏
  • 举报
回复
静态方法 返回值 为实现了IEnumerable的类型咯
wrost 2012-09-06
  • 打赏
  • 举报
回复
泛型我大概了解了。


疑问:
现在对于public static IEnumerable Power(int number, int exponent)这种表达方式还不太理解,原来是一个静态方法,加一个IEnumerable 又表示什么意思? 以前只知道 public 类名:接口名这种表达方式
anabiosispe 2012-09-05
  • 打赏
  • 举报
回复
<T>,这里的T,理解成Type,一种类型。
一般来说这个乏型就是他处理的<T>数据时,这个数据类型可变,可以是class a,也可以class b,有些时候很方便。
安分的小男人 2012-09-05
  • 打赏
  • 举报
回复
简单的说T就是指任意类型!
wrost 2012-09-05
  • 打赏
  • 举报
回复
非常感谢! 我先消化一下!
stonespace 2012-09-05
  • 打赏
  • 举报
回复
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泛型类无关,它是编译器生成的,
stonespace 2012-09-05
  • 打赏
  • 举报
回复
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等类型,这样就可以省掉重复实现,
wrost 2012-09-05
  • 打赏
  • 举报
回复
刚开始看泛型,希望解释下

111,118

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧