當我需要傳遞一個泛型類型,我可以使用語法C#推導泛型方法
(例如:Ofcourse它不是一個泛型方法)
public void Sample(T someValue)
{
......
}
什麼是宣佈Sample<T>
的好處?
我的意思是
public void Sample<T> (T someValue)
{
......
}
當我需要傳遞一個泛型類型,我可以使用語法C#推導泛型方法
(例如:Ofcourse它不是一個泛型方法)
public void Sample(T someValue)
{
......
}
什麼是宣佈Sample<T>
的好處?
我的意思是
public void Sample<T> (T someValue)
{
......
}
對於這項工作:
public void Sample(T someValue)
{
......
}
的類型T必須在系統中已經聲明。該方法將只接受T型或其衍生物。
通過聲明如下:
public void Sample<T> (T someValue)
{
......
}
你說的方法將接受來自任何類型。
如果你的類不是泛型的,你可以使用第二個例子。這意味着你可以使這種方法通用。如果你的類是通用的,你應該使用你的第一個例子。
通用類型和通用方法是非常不同的東西。這聽起來像你有一個泛型類型:
class SomeType<T> {
public void Sample(T someValue) {...}
}
,並討論其裏面的一般方法:
class SomeType<T> {
public void Sample<T>(T someValue) {...}
}
這些都是非常不同。在第一個,Sample
裏面,那麼T
的意思是「T
已經傳遞到SomeType<T>
」。在第二個,Sample
內部,這是一個獨立和獨立的T
- 「T
已被傳遞到Sample<T>
」。實際上,稱它爲T
(在這種情況下)是一個錯誤。你可以有,例如:
var obj = new SomeType<int>(); // here T for SomeType<T> is int
obj.Sample<decimal>(123.45M); // here T for Sample<T> is decimal
注意,有沒有簡單的方法(內Sample<T>
)說:「在SomeType<T>
的T
」的 - 因此你爲什麼要重命名方法的泛型類型參數。
有這種類型的情況下有效的方案(泛型類型的泛型方法),例如(注意:在新的名稱):
class SomeType<T> {
public void Sample<TActual>(TActual someValue) where TActual : T, new() {...}
}
這使得我們可以做一些很有趣的事情來講繼承等 - 或者您可能需要一個通用方法,該方法具有很少或沒有與T
的關係。這也沒關係。
考慮以下幾點:
class SomeClass<T>
{
public void Sample(T value)
{
// code goes here
}
}
或本:
class SomeClass
{
public void Sample<T>(T value)
{
// code goes here
}
}
在第一種情況下,在特定的情況下T
的所有來電Sample
將是相同的類型。在第二種情況下,特定實例中的每個調用都可以具有其自己的類型T
,因爲泛型類型實參與方法調用一起提供。
第二種方法可以有很多用途,但一個,我是用我自己有時是在工廠方法:
public static class SomeFactory
{
public static T CreateSomeObject<T>()
{
T result = Activator.CreateInstance<T>();
// perform any extra initialization
return result;
}
}
你的意思是類而不是系統? – jfar 2009-11-13 15:48:27
不一定。可以在這個課程或其他地方聲明,只需要在這個地方知道。 – 2009-11-13 15:58:28