2010-04-30 62 views
24

我是一個VB.Net的傢伙。 (因爲我必須這麼做,因爲在我的支票上簽名的人是這麼說的:P)我是用Java成長的,當我有機會的時候,我一般不會在C#中閱讀或寫作。我今天遇到了一些我從未見過的語法,而且我似乎無法弄清楚。在C#中,什麼是<T>方法聲明之後?

在下面的方法聲明中,T>代表什麼<?

靜態無效美孚< T>(PARAMS T []×)

我見過連用聲明泛型集合和東西,但我不能爲我的生命弄清楚它做什麼的這種方法。

萬一它很重要,我想到C# brain teasers時遇到它。第六個預告片包含整個代碼片段。

回答

20

這定義了generic method,它是generics的一種形式,它們被添加到C#2.0中的C#中。

方法SIG應該是:

static void Foo<T>(params T[] x) 
{ // ... 

這可以傳遞任何數量的任何(特定)的參數輸入到方法FOO,和它作用的論點,即陣列上。它與通用類型的工作方式類似,但僅限於該方法的範圍。該<T>指定參數的類型被傳遞到方法,這樣你就可以調用這個像:

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance); 
+0

具體而言,它定義了名稱(或名稱)的使用用於該方法的一般類型。 – 2010-04-30 15:53:51

+1

我的理解是,在這段代碼中,(params T [] x)負責聲明該方法接受任意數量的T型參數並將它們存儲在由x引用的數組中。如果這是正確的,方法名稱後面的< T >將添加到聲明中? – Drew 2010-04-30 16:02:25

+0

也許它允許調用者在描述作爲參數傳遞的變量的類型時更加詳細。只要myClassInstance和myClassInstance2是同一類型,我可以通過一行讀取Foo(myClassInstance,myClassInstance2)來調用Foo嗎? – Drew 2010-04-30 16:04:20

1

這是一個泛型方法的泛型類型參數。

一旦您在調用方法時爲T指定了一個類型,.NET就可以根據該類型參數確保類型安全。

static void Foo<T>(params T[] x) { } 

將被稱爲像:

string[] names = new string[] {"Foo", "Bar", "Baz"}; 

Foo<string>(names); 

但這會導致編譯器錯誤:

int[] nums = new int[] {1, 2, 3}; 

Foo<string>(nums); // nums is not string[] 
1

的T是type parameter在這種情況下可以是任何東西(約束可能被指定,但這裏沒有約束)。如果沒有這個功能,您必須聲明方法,你打算使用每種類型:仿製藥

static void Foo(params int[] x)  
static void Foo(params string[] x)  
static void Foo(params Customer[] x)  
etc... 

的更多信息可以在MSDN上找到:Introduction to Generics (C#)

+0

以下是關於泛型類型的MSDN頁面 http://msdn.microsoft.com/en-us/library/512aeb7t.aspx – Armstrongest 2010-04-30 16:01:11

25

你在問什麼是在C#泛型的概念。通過使用泛型,你可以使用這種方法你想要的類型

假設你必須創建一個函數來添加兩個數字。 在這種情況下,你的函數是

//For integer : 
public int sum(int a, int b) 
{ 
    return a + b; 
} 



//For floating point numbers : 
public float sum(float a, float b) 
{ 
    return a + b; 
} 

按照這樣的邏輯,如果你想將總結兩個雙型號碼,您將創建一個更加功能等功能。

卜與仿製藥的幫助下,你可以取代所有這些功能和寫入以下,

public T sum<T>(T a, T b) 
{ 
    return a + b; 
} 

這將適用於所有已數字類型,以及字符串。

檢查了這一點爲更詳細地:http://www.codeproject.com/kb/books/EssentialCS20.aspx

+3

+1代碼示例和易於遵循的示例!對所提問題和OP的理解水平有清晰的瞭解。 – Armstrongest 2010-04-30 16:03:23

+0

好的例子,很好的答案。 – backslash17 2010-04-30 16:06:29

+2

這個例子很容易理解,但它不起作用。您不能添加泛型類型T的兩個變量。請參閱:http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers解決方法是使用外部庫中的泛型操作符:http:/ /www.yoda.arachsys.com/csharp/miscutil/usage/genericoperators.html – 2010-04-30 16:23:32

相關問題