程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 泛型,泛型編程

泛型,泛型編程

編輯:C#入門知識

泛型,泛型編程


描述:

泛型是具有占位符(類型參數)的類、結構、接口和方法。 

泛型集合類可以將類型參數用作它存儲的對象的類型。

泛型方法可以將其類型參數用作其返回值的類型或某個形參的類型。

例1:泛型類定義.

定義一個類Generic,當給予其int類型時,Field字段的類型是int;當給予其string類型時,Field字段的類型是string.


public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Generic<int> g = new Generic<int>();
        g.Field = 1;

        Generic<string> s = new Generic<string>();
        s.Field = "123";
    }
}

public class Generic<T>
{
    public T Field;
}

例2:泛型方法定義是具有兩個參數列表的方法:一個泛型類型參數列表和一個形參列表.類型參數可以作為返回類型或形參的類型出現.


public class Generic<T>
{
    public T Field;

    /// <summary>
    /// 泛型方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    public T Ge<T>(T t)
    {
        return t;
    }
}

泛型方法可以出現在泛型或者非泛型上.此處要注意的是:

並不是只要方法屬於泛型類型,或者甚至是方法的形參的類型時封閉的泛型參數,就可以說方法是泛型方法.

只有當方法具有它自己的類型參數列表時,才能稱其為泛型方法.


泛型的優點:

1.提高了性能,可以有效的避免裝箱和拆箱.

使用ArrayList:

protected void Page_Load(object sender, EventArgs e)
{
    ArrayList list = new ArrayList();

    //執行裝箱操作
    list.Add(44);

    //執行裝箱操作
    list.Add(45);

    foreach (int i in list)
    {
        //執行拆箱操作
        Response.Write(i.ToString() + "<br/>");
    }
    
}

使用泛型:

protected void Page_Load(object sender, EventArgs e)
{   
    List<int> list = new List<int>();

    //不需要執行裝箱操作
    list.Add(44);
    //不需要執行裝箱操作
    list.Add(45);

    foreach (int i in list)
    {
        //不需要執行拆箱操作
        Response.Write(i.ToString() + "<br/>");
    }
    
}

2.類型安全.如果使用對象Object,則可以添加任意類型,如果泛型中確定為某一類型,則只能對該類型的對象進行操作.

見上例,可以在ArrayList中添加一個字符串,但是不能在List<int>對象中添加字符串. 


泛型實例

描述:

比較狗的大小和汽車的大小.其中狗的大小衡量采用年齡,汽車的大小衡量單位是噸位.

因為要實現比較方法,所以兩個類都實現了IComparable<T>接口,該接口定義如下:

namespace System
{
    // 摘要:
    //     定義由值類型或類實現的通用的比較方法,以為排序實例創建類型特定的比較方法。
    public interface IComparable<T>
    {
        // 摘要:
        //     比較當前對象和同一類型的另一對象。
        //
        // 參數:
        //   other:
        //     與此對象進行比較的對象。
        //
        // 返回結果:
        //     一個 32 位有符號整數,指示要比較的對象的相對順序。返回值的含義如下: 值 含義 小於零 此對象小於 other 參數。零 此對象等於 other。
        //     大於零 此對象大於 other。
        int CompareTo(T other);
    }
}

狗的定義如下:

public class Dog : IComparable<Dog>
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Dog(string name, int age)
    {
        this.Name = name;
        this.Age = age;
    }

    public int CompareTo(Dog other)
    {
        return this.Age-other.Age;
    }

    public override string ToString()
    {
        return string.Format("Name:{0}    Age:{1}<br/>", this.Name, this.Age);
    }
}

汽車的類定義如下:

public class Car : IComparable<Car>
{
    public string Name { get; set; }
    public int Weight { get; set; }

    public Car(string name, int weight)
    {
        this.Name = name;
        this.Weight = weight;
    }

    public int CompareTo(Car other)
    {
        return this.Weight - other.Weight;
    }
    
    public override string ToString()
    {
        return string.Format("Name:{0}    Weight:{1}<br/>", this.Name, this.Weight);
    }
}

比較類定義如下:

public class Generic
{
    public static T Max<T>(T t1, T t2)
    {
        IComparable<T> ic1 = t1 as IComparable<T>;
        return ic1.CompareTo(t2) > 0 ? t1 : t2;
    }
}

應用:

public partial class Default3 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Dog d1 = new Dog("貝貝", 6);
        Dog d2 = new Dog("點點", 5);
        Display<Dog>(Generic.Max<Dog>(d1, d2));


        Car c1 = new Car("奔馳", 3);
        Car c2 = new Car("東風", 10);
        Display(Generic.Max(c1, c2));
    }


    void Display<T>(T t)
    {
        Response.Write(t.ToString());
    }
}

結果:

Name:貝貝    Age:6
Name:東風    Weight:10

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved