2010-04-30 38 views
24

Tôi là một anh chàng VB.Net. (vì tôi phải như vậy, bởi vì người ký tên vào tờ séc của tôi nói như vậy.) Tôi đã lớn lên trong Java và tôi thường không đấu tranh để đọc hoặc viết trong C# khi tôi có cơ hội. Tôi đã đi qua một số cú pháp ngày hôm nay mà tôi chưa bao giờ thấy, và tôi dường như không thể tìm ra.Trong C#, <T> Sau khi khai báo phương thức là gì?

Trong khai báo phương pháp sau, < T> đại diện cho điều gì?

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

Tôi đã thấy sử dụng kết hợp với tuyên bố bộ sưu tập chung và điều gì đó, nhưng tôi có thể không cho cuộc sống của tôi ra gì nó làm cho phương pháp này.

Trong trường hợp quan trọng, tôi gặp phải vấn đề này khi suy nghĩ về một số C# brain teasers. Lời trêu ghẹo thứ sáu chứa toàn bộ đoạn mã.

Trả lời

20

Điều này xác định một generic method, là một hình thức generics, được thêm vào C# trong C# 2.0.

Phương pháp sig nên là:

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

này cho phép bạn vượt qua bất kỳ số lượng các đối số của bất kỳ (cụ thể) gõ vào phương pháp Foo, và nó hoạt động trên đó mảng các đối số. Nó tương tự như cách các kiểu generic hoạt động, ngoại trừ scoped chỉ với phương thức. Các <T> quy định cụ thể các loại của các đối số được truyền vào phương pháp này, vì vậy bạn có thể gọi đây như:

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

Cụ thể, nó xác định tên (hoặc tên) sử dụng cho các loại generic (s) trong phương pháp này. –

+1

Sự hiểu biết của tôi là trong mã này, (params T [] x) có trách nhiệm khai báo rằng phương thức lấy bất kỳ số lượng đối số nào của kiểu T và lưu chúng trong một mảng được tham chiếu bởi x. Nếu điều đó đúng, thì < T > sau tên phương thức thêm vào khai báo là gì? – Drew

+0

Có lẽ nó cho phép người gọi có nhiều chi tiết hơn trong việc mô tả loại biến được chuyển thành tham số. Tôi có thể gọi Foo với một dòng mà đọc Foo (myClassInstance, myClassInstance2) miễn là myClassInstance và myClassInstance2 có cùng loại không? – Drew

1

Đó là tham số Loại Generic của một phương pháp chung.

Khi bạn chỉ định loại cho T khi gọi phương thức, .NET có thể đảm bảo loại an toàn dựa trên thông số loại đó.

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

sẽ được gọi như:

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

Foo<string>(names); 

nhưng điều này sẽ gây ra một lỗi biên dịch:

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

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

T là một type parameter và trong trường hợp này có thể là bất cứ điều gì (một hạn chế có thể được chỉ định, nhưng ở đây không có ràng buộc). Nếu không có tính năng này, bạn sẽ phải khai báo phương pháp này cho tất cả các loại bạn có kế hoạch để sử dụng:

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

Thông tin thêm về Generics có thể được tìm thấy trên MSDN: Introduction to Generics (C#).

+0

Đây là trang MSDN trên Các Loại Chung http://msdn.microsoft.com/en-us/library/512aeb7t.aspx – Armstrongest

25

những gì bạn đang hỏi là khái niệm về generics trong C#. Bằng cách sử dụng generics, bạn có thể sử dụng phương pháp này cho các loại bạn muốn

giả sử bạn phải tạo một hàm để thêm hai số. Trong trường hợp đó, chức năng của bạn là

//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; 
} 

Theo logic này, nếu bạn muốn có một chức năng mà sẽ tổng hai số kiểu double bạn sẽ tạo ra một chức năng hơn, và như vậy.

Bu với sự giúp đỡ của Generics bạn có thể thay thế tất cả các chức năng này và viết những điều sau đây,

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

này sẽ làm việc cho tất cả các loại số, cũng như cho các chuỗi.

việc kiểm tra này ra để xem chi tiết hơn: http://www.codeproject.com/kb/books/EssentialCS20.aspx

+3

+1 cho mã Mẫu và dễ làm theo ví dụ! Cho thấy sự hiểu biết rõ ràng về Câu hỏi được hỏi và mức độ hiểu biết của OP. – Armstrongest

+0

Câu trả lời hay với các ví dụ hay. – backslash17

+2

Ví dụ này rất dễ hiểu, tuy nhiên nó không hoạt động. Bạn không thể thêm hai biến chung loại T. Xem: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers Cách giải quyết là sử dụng toán tử chung từ thư viện bên ngoài: http://www.yoda.arachsys.com/csharp/miscutil/usage/genericoperators.html –

Các vấn đề liên quan