Polecam omijanie typów ogólnych, w których działa nietypowa składnia, na przykład podany przykład. Istnieją jednak inne przydatne przypadki.
Na przykład, określając typ zwracany rodzajowo:
static T Create<T>() where T: Sample, new()
{
return new T();
}
// Calling code
Sample sample = Create<Sample>();
zamiast
static object Create()
{
return new Sample();
}
// Calling code
Sample sample = (Sample) Create();
Można również użyć szablonów umieszczenie wielu ograniczeń typu. Na przykład:
static T Create<T>() where T: IMyInterface, new()
{
return new T();
}
interface IMyInterface {}
class MyClass : IMyInterface { }
// Calling code.
MyClass myClass = Create<MyClass>();
Umożliwia to generyczne tworzenie nowego typu, który implementuje określony interfejs i ma ogólny konstruktor. Też:
static void DoSomething<T>(T t) where T: IMyInterface1, IMyInterface2
{
t.MethodOnIMyInterface1();
t.MethodOnIMyInterface2();
}
interface IMyInterface1
{
void MethodOnIMyInterface1();
}
interface IMyInterface2
{
void MethodOnIMyInterface2();
}
class MyClass: IMyInterface1, IMyInterface2
{
// Method implementations omitted for clarity
}
// Calling code
MyClass myclass'
DoSomething(myclass); // Note that the compiler infers the type of T.
Gdzie można wymagać wiele interfejsów za pomocą pojedynczego parametru bez (1) tworząc nowy typ, który implementuje te wszystkie interfejsy i (2) wymaga parametrów do danego typu.
Jak zaznacza @dcastro w swojej/jej odpowiedzi, typy ogólne mogą również informować kompilator, aby wymagał typów są takie same. Na przykład:
static void DoSomething<T>(T t1, T t2) where T: MyType
{
// ...
}
class MyType {}
class MyType1: MyType {}
class MyType2: MyType {}
// Calling code
MyType1 myType1;
MyType2 myType2;
DoSomething<MyType>(myType1, myType2);
Jeżeli kompilator wymaga t1 i t2 są tego samego typu, ale może być dowolnego typu, który dziedziczy MyType
. Jest to przydatne w zautomatyzowanych strukturach testowania jednostkowego, takich jak NUnit lub MSTest, do generycznych sprawdzeń równości i porównywania.
W przypadku rzeczy, które są przekazywane do metod korzyści są rzeczywiście niewielkie. W przypadku rzeczy, które są ponownie zwracane, pomaga to nieco więcej, ponieważ konsument nie musi przesyłać. – Joey