Tôi khuyên bạn nên tránh các loại chung mà cú pháp không chung chung hoạt động, chẳng hạn như ví dụ bạn đã cung cấp. Tuy nhiên, có những trường hợp hữu ích khác.
Ví dụ, xác định kiểu trả về quát:
static T Create<T>() where T: Sample, new()
{
return new T();
}
// Calling code
Sample sample = Create<Sample>();
thay vì
static object Create()
{
return new Sample();
}
// Calling code
Sample sample = (Sample) Create();
Bạn cũng có thể sử dụng các mẫu để đặt nhiều hạn chế đối với một loại. Ví dụ:
static T Create<T>() where T: IMyInterface, new()
{
return new T();
}
interface IMyInterface {}
class MyClass : IMyInterface { }
// Calling code.
MyClass myClass = Create<MyClass>();
Điều này cho phép tạo chung một loại mới triển khai giao diện cụ thể và có một hàm tạo chung. Đồng thời:
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.
Nơi bạn có thể yêu cầu nhiều giao diện trên một tham số duy nhất mà không (1) tạo loại mới triển khai tất cả các giao diện này và (2) yêu cầu tham số thuộc loại đó.
Khi @dcastro chỉ ra câu trả lời của mình, các loại chung cũng có thể yêu cầu trình biên dịch yêu cầu loại là giống nhau. Ví dụ:
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);
Trong trường hợp trình biên dịch đòi hỏi t1 và t2 là cùng loại nhưng có thể là bất kỳ loại mà được thừa hưởng MyType
. Điều này rất hữu ích trong các khung kiểm thử đơn vị tự động, chẳng hạn như NUnit hoặc MSTest, để kiểm tra tính bình đẳng và so sánh chung.
Đối với những thứ được chuyển đến phương pháp, lợi ích thực sự là khá nhỏ. Đối với những thứ được trả lại một lần nữa nó sẽ giúp nhiều hơn một chút bởi vì người tiêu dùng không cần phải đúc. – Joey