首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于泛型,请高手过来看看。该如何处理

2012-01-01 
关于泛型,请高手过来看看。今天学习泛型,看得晕呼晕呼的,请大侠帮忙解析一下泛型主要做什么用,在业务逻辑上

关于泛型,请高手过来看看。
今天学习泛型,看得晕呼晕呼的,请大侠帮忙解析一下泛型主要做什么用,在业务逻辑上可以解决什么问题。还有下面的代码怎么去理解。
#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 泛型委托表示对指定的对象执行操作的方法

就像楼上所说,由于参数类型在编译时才能决定所以对占位符的操作只能用委托方法

泛型最重要的一个优点就是不要求进行运行时类型检查。语言现有的类型检查是有限的,因为编译器只知道那么多。开发者如果因为错误的强制类型转换而遇到运行时异常,这个限制还会变得更加明显。相反,支持泛型的编译器将运行时类型检查提前到编译时执行,使代码更安全

泛型是为了优化代码,提高代码重用性,和业务逻辑没有必然联系

热点排行