关于泛型,请高手过来看看。
今天学习泛型,看得晕呼晕呼的,请大侠帮忙解析一下泛型主要做什么用,在业务逻辑上可以解决什么问题。还有下面的代码怎么去理解。
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace ListDemo
{
public class FindRacer
{
private string car;
public FindRacer(string car)
{
this.car = car;
}
public bool DrivingCarPredicate(Racer racer)
{
return racer.Car == car;
}
}
public class RacerComparer : IComparer <Racer>
{
public enum CompareType
{
Name,
Car
}
private CompareType compareType;
public RacerComparer(CompareType compareType)
{
this.compareType = compareType;
}
#region IComparer <Racer> Members
public int Compare(Racer x, Racer y)
{
int result = 0;
switch (compareType)
{
case CompareType.Name:
result = x.Name.CompareTo(y.Name);
break;
case CompareType.Car:
result = x.Car.CompareTo(y.Car);
break;
}
return result;
}
#endregion
}
public class Person
{
private string firstname;
public string Firstname
{
get
{
return firstname;
}
set
{
firstname = value;
}
}
private string lastname;
public string Lastname
{
get
{
return lastname;
}
set
{
lastname = value;
}
}
public Person(string firstname, string lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
public override string ToString()
{
return firstname + " " + lastname;
}
}
public class Racer
{
private string name;
public string Name
{
get
{
return name;
}
}
private string car;
public string Car
{
get
{
return car;
}
}
public Racer(string name, string car)
{
this.name = name;
this.car = car;
}
public override string ToString()
{
return name;
}
}
class Program
{
static void Main(string[] args)
{
List <Racer> racers = new List <Racer> ();
racers.Add(new Racer( "Michael Schumacher ", "Ferrari "));
racers.Add(new Racer( "Juan Pablo Montoya ", "McLaren-Mercedes "));
racers.Add(new Racer( "Kimi Raikkonen ", "McLaren-Mercedes "));
racers.Add(new Racer( "Mark Webber ", "Williams-BMW "));
racers.Add(new Racer( "Rubens Barichello ", "Ferrari "));
FindRacer finder = new FindRacer( "Ferrari ");
foreach (Racer racer in racers.FindAll(new Predicate <Racer> (finder.DrivingCarPredicate)))
{
Console.WriteLine(racer);
}
racers.ForEach(delegate(Racer r) { Console.WriteLine(r); }); //不明白
racers.FindAll(new Predicate <Racer> (finder.DrivingCarPredicate)).
ForEach(delegate(Racer r) { Console.WriteLine(r); }); //不明白
racers.Sort(delegate(Racer r1, Racer r2) { return r1.Name.CompareTo(r2.Name); }); //不明白
racers.Sort(new RacerComparer(RacerComparer.CompareType.Car)); //不明白
Console.WriteLine( "\nSorted ");
racers.ForEach(delegate(Racer r) { Console.WriteLine(r); }); //不明白
List <Person> persons = racers.ConvertAll <Person> (delegate(Racer r) {
int ixSeperator = r.Name.LastIndexOf( ' ') + 1;
string lastname = r.Name.Substring(ixSeperator, r.Name.Length - ixSeperator);
string firstname = r.Name.Substring(0, ixSeperator - 1);
return new Person(firstname, lastname);
}); //不明白
Console.WriteLine( "Persons ");
persons.ForEach(delegate(Person p) { Console.WriteLine(p); }); //不明白
}
}
}
[解决办法]
泛型的主要目的是将对象信息延迟到编译时绑定,泛型符号相当于占位符,到编译的时候确定被占位置的具体数据类型.这样最主要的好处就很明了了,就是让你少写代码.
另外,由于是在编译时替换,所以可以减少装箱和拆箱.
[解决办法]
泛型 就想楼上说的
主要就是 对于一个 类型的参数 可以在 编译时刻来决定
实际就是让你 使用同样一种处理 过程的 代码
可以 应对多种类型.
[解决办法]
泛型仅仅是编程手段,和业务逻辑没有必然联系
------解决方案--------------------
lz不明白的地方叫做泛型委托。Action 泛型委托表示对指定的对象执行操作的方法
就像楼上所说,由于参数类型在编译时才能决定所以对占位符的操作只能用委托方法
泛型最重要的一个优点就是不要求进行运行时类型检查。语言现有的类型检查是有限的,因为编译器只知道那么多。开发者如果因为错误的强制类型转换而遇到运行时异常,这个限制还会变得更加明显。相反,支持泛型的编译器将运行时类型检查提前到编译时执行,使代码更安全
泛型是为了优化代码,提高代码重用性,和业务逻辑没有必然联系