新手初次接触泛型,理解比较吃力。下面是网上一片文章的一部分,希望各位前辈能解答下。//MyList.cs
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace CLRSupportExample
{
public class MyList<T>
{
private static int objCount = 0;
public MyList()
{objCount++; }
public int Count
{
get
{return objCount; }
}
}
}
//Program.cs
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace CLRSupportExample
{
class SampleClass {}
class Program
{
static void Main(string[] args)
{
MyList<int> myIntList = new MyList<int>();
MyList<int> myIntList2 = new MyList<int>();
MyList<double> myDoubleList = new MyList<double>();
MyList<SampleClass> mySampleList = new MyList<SampleClass>();
Console.WriteLine(myIntList.Count);
Console.WriteLine(myIntList2.Count);
Console.WriteLine(myDoubleList.Count);
Console.WriteLine(mySampleList.Count);
Console.WriteLine(new MyList<sampleclass>().Count);
Console.ReadLine();
}
}
}得到结果
2
2
1
1上面2个为什么说2呢?
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace CLRSupportExample
{
public class MyList<T>
{
private static int objCount = 0;
public MyList()
{objCount++; }
public int Count
{
get
{return objCount; }
}
}
}
//Program.cs
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace CLRSupportExample
{
class SampleClass {}
class Program
{
static void Main(string[] args)
{
MyList<int> myIntList = new MyList<int>();
MyList<int> myIntList2 = new MyList<int>();
MyList<double> myDoubleList = new MyList<double>();
MyList<SampleClass> mySampleList = new MyList<SampleClass>();
Console.WriteLine(myIntList.Count);
Console.WriteLine(myIntList2.Count);
Console.WriteLine(myDoubleList.Count);
Console.WriteLine(mySampleList.Count);
Console.WriteLine(new MyList<sampleclass>().Count);
Console.ReadLine();
}
}
}得到结果
2
2
1
1上面2个为什么说2呢?
MyList<int> myIntList2 = new MyList<int>();运行了两次
找到了2篇文章,有需要的可以看下。
http://blog.163.com/wangpeng126_2009@126/blog/static/1210226112010515113826356/
http://www.360doc.com/content/11/0314/22/3705007_101160628.shtml
有没有大牛再来讲下关于 泛型 的知识,不胜感激!
泛型没什么复杂的 举个简单且常见的泛型List<T> 就是这种 T表示任何类型的数据 比如List<String> 表示定义了一个可以存储或返回String类型的List集合 这个List是系统自由的应该好理解吧 当然你也可以自己定义 就好比你的例子MyList<T> 表示可以存储或返回任何类型的MyList集合接下来看下结果,在看之前你注意这条语句private static int objCount = 0;
这是个静态变量 相同类型的参数只会执行一便
MyList<int> myIntList = new MyList<int>(); //传递过去的是int类型 objCount+1
MyList<int> myIntList2 = new MyList<int>(); // 传过去的还是int类型 objCount再+1
所以 输出的值就为2了
MyList<double> myDoubleList = new MyList<double>(); //传递过去的是double类型 那么重新执行一下 private static int objCount = 0; 且objCount+1
MyList<SampleClass> mySampleList = new MyList<SampleClass>(); //同理传过去的类型又变了 所以又执行一下private static int objCount = 0; 且objCount+1所以后面的输出就是2,2,1,1 了 那么最后一个2又是怎么来的呢
Console.WriteLine(new MyList<sampleclass>().Count);
那是因为再输出之前又一次实例化了sampleclass 这个类型 所以 在上一次的objCount再+1
所以输出2了
MyList<int>是一种类型,MyList<double>是一种类型,MyList<Bitmap>是一种集合,MyList<Image>也是一种类型,而且它们都毫无关系。尽管Image是Bitmap的父类,但是后边两个类型则毫无继承关系(现在.net支持泛型的协变和逆变,但是仅限于接口声明中特定的地方作为声明,并不能用于实际创造类型)。注意MyList不是任何一种类型,你可以定义一种叫做MyList的类型,但是带上<...>就跟不带它完全不同的意思了。MyList<T>类似于代码生成器(宏、模板),它用于动态产生类型。数学上,你可以说它是一种类型映射机制,即输入类型参数,输出新的类型。但是它自己并不是类型。
因此在lz的Main代码中,分别使用了三种类型,来创建了5个类型实例(对象)。把泛型的名称跟类型分开,这是关键。如果你认为泛型名称相同的东西都是同一个类型,你就糊涂了!