2009-03-01 38 views
7

Tôi đã gặp rất nhiều nhầm lẫn về sự khác biệt của loại tham chiếu chung so với loại giá trị chung trong quá trình mã hóa API của tôi.C# generics: loại tham chiếu so với giá trị

Guys, câu hỏi là những gì khác biệt liên quan đến những hạn chế và chức năng (/ người dễ dàng bỏ qua quan trọng nhất) giữa hai con thú này:

class ReferenceGeneric <T> where ??? 
{ 

} 

struct ValueGeneric <T>: where ??? 
{ 


} 

Sửa Chỉ cần làm rõ câu hỏi và những gì tôi đang làm sau: Tôi muốn biết bạn có thể làm gì với các loại tham chiếu chung và KHÔNG thể làm với các loại giá trị chung ... và visa ngược

Chỉnh sửa # 2 Giải thích rõ hơn: Làm thế nào để T có thể bị ràng buộc nếu loại chung là tham chiếu hoặc loại giá trị - có khác biệt về cách mỗi loại có thể bị ràng buộc?

+0

Câu hỏi của bạn rất rõ ràng sử dụng ... có một câu trả lời ngoài kia nhưng sau đó bạn là gì? – andleer

+0

bạn nói bạn phải tinh chỉnh đôi khi. bạn có thể đưa ra một ví dụ không? –

+0

Tôi đã xây dựng câu hỏi trong phần chỉnh sửa. –

Trả lời

13

Lưu ý rằng mọi thứ được khai báo dưới dạng cấu trúc là luôn là loại giá trị và mọi thứ được khai báo là lớp là luôn là loại tham chiếu. Nói cách khác, List<int> vẫn là một loại tài liệu tham khảo, và nếu bạn có:

struct Foo<T> 
{ 
    T value; 
} 

sau đó Foo<string> sẽ vẫn là một loại giá trị.

Đối với những gì bạn có thể làm với các loại chung - chúng thực sự chỉ tuân theo các quy tắc thông thường cho các loại giá trị và loại tham chiếu; đối với những gì bạn có thể làm với giá trị loại Ttrong phạm vi loại, điều đó phụ thuộc vào việc/T có bị ràng buộc hay không. Nó không thay đổi dựa trên việc loại generic có phải là cấu trúc hay một lớp hay không.

EDIT: Sasha đề cập đến Nullable<T> trong các nhận xét. Tôi không chắc chắn "ngoại lệ" có ý nghĩa gì ở đây - ngoài Nullable<T> không đáp ứng ràng buộc "where T : struct" hoặc "where T : class". Nó vẫn là một loại giá trị mặc dù (đó là một phần của điểm).

+0

Jon, có một ngoại lệ nếu kiểu cấu trúc là Nullable. Bạn sẽ xây dựng trên đó là tốt? thx –

+0

cảm ơn cho việc xây dựng ... –

+0

"bất cứ điều gì được khai báo là một lớp luôn luôn là một loại giá trị" typo? – ShuggyCoUk

8

Để đối phó với Edit2: Bạn có thể hạn chế các loại phép để tham khảo hoặc giá trị bằng cách như sau:

tham khảo:

class ReferenceGeneric <T> where T: class 
{ 

} 

Value:

struct ValueGeneric <T> where T: struct 
{ 


} 

Từ trang sau trên MSDN http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

Bạn có thể hạn chế struct bởi lớp: struct ValueGeneric nơi T: lớp { } –

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