位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 定義泛型類

提問人:劉團圓發(fā)布時間:2020-12-08

要創(chuàng)建泛型類,只需要在類定義中包含尖括號語法:

    class MyGenericClass<T> { ... }

其中T可以是任意標(biāo)識符,只要遵循通常的C#命名規(guī)則即可,例如,不以數(shù)字開頭等。但一般只使用T。泛型類可在其定義中包含任意多個類型參數(shù),參數(shù)之間用逗號分隔,例如:

    class MyGenericClass<Tl, T2, T3> { ... }

定義了這些類型后,就可以在類定義中像使用其他類型那樣使用它們。可以把它們用作成員變量的類型、屬性或方法等成員的返回類型以及方法的參數(shù)類型等。例如:

class MyGenericClass<Tl, T2, T3>

{

    private T1 innerTlObject; 

    public MyGenericClass(T1 item)

    {

        innerTlObject = item;

    }

    public T1 InnerTlObject 

    {

        get { return innerTlObjact; }

    }

}

其中,類型T1的對象可以傳遞給構(gòu)造函數(shù),只能通過InnerTlObject屬性對這個對象進行只讀訪問。注意,不能假定為類提供了什么類型。例如,下面的代碼就不會編譯:

class MyGenericClass<Tl, T2, T3>

{

    private T1 innerTlObject;

    public MyGenericClass()

    {

        innerTlObject = new T1 ();

    }

    public T1 InnerTlObject 

    {

        get { return innerTlObject; }

    }

}

    我們不知道T1是什么,也就不能使用它的構(gòu)造函數(shù),它甚至可能沒有構(gòu)造函數(shù),或者沒有可公共訪問的默認構(gòu)造函數(shù)。如果不使用涉及高級技術(shù)的復(fù)雜代碼,則只能對T1進行如下假設(shè):可以把它看成繼承自System.Object的類型或可以封箱到System.Object中的類型。

    顯然,這意味著不能對這個類型的實例進行非常有趣的操作,或者對為MyGenericClass泛型類提供的其他類型進行有趣的操作。不使用反射技術(shù),就只能使用下面的代碼:

public string GetAllTypesAsString()

{

    return "T1 = " + typeof (Tl) .ToString() + T2 = " + typeof (T2) .ToString() + ", T3 = " + typeof (T3) .ToStringO ;

}

    可以做一些其他工作,尤其是對集合進行操作,因為處理對象組是非常簡單的,不需要對對象類型進行任何假設(shè),這是為什么存在泛型集合類的一個原因。

    另一個需要注意的限制是,在比較為泛型類型提供的類型值和null時,只能使用運算符=或!=。例如,下面的代碼會正常工作:

public bool Compare{Tl opl, Tl op2)

{

    if (opl != null && op2 != null)

    {

        return true;

    }

    else

    {

        return false;

    }

}

其中,如果Tl是一個值類型,則總是假定它是非空的,于是在上面的代碼中,Compare總是返回true。但是,下面試圖比較兩個實參opl和op2的代碼將不能編譯:

public bool Compare{Tl opl, Tl op2)

{

    if (opl ~ op2)

    {

        return true;

    }

    else

    {

        return false;

    }

}

其原因是這段代碼假定Tl支持==運算符。這說明,要對泛型執(zhí)行實際操作,需要更多地了解類中使用的類型。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部