2012-11-30 37 views
105

Có thể ai đó hãy giải thích Tuple là gì và cách sử dụng Tuple trong Kịch bản thế giới thực. Tôi muốn tìm hiểu làm thế nào điều này có thể làm phong phú thêm kinh nghiệm viết mã của tôi?Điều gì và khi nào cần sử dụng Tuple?

Trả lời

108

Điều này msdn article giải thích rõ ràng với các ví dụ "Một bộ dữ liệu là cấu trúc dữ liệu có số lượng và chuỗi các thành phần cụ thể".

Tuples thường được sử dụng trong bốn cách:

  1. Đại diện một bộ dữ liệu. Ví dụ, một tuple có thể đại diện cho một bản ghi cơ sở dữ liệu và các thành phần của nó có thể đại diện cho các trường riêng lẻ của bản ghi.

  2. Để cung cấp truy cập dễ dàng và thao tác, tập dữ liệu.

  3. Để trả về nhiều giá trị từ một phương pháp mà không sử dụng các tham số (trong C#) hoặc ByRef thông số (trong Visual Basic).

  4. Để chuyển nhiều giá trị cho một phương thức thông qua một tham số. Đối với ví dụ , phương thức Thread.Start(Object) có một tham số duy nhất cho phép bạn cung cấp một giá trị cho phương thức mà chuỗi thực thi tại thời gian khởi động. Nếu bạn cung cấp đối tượng Tuple<T1, T2, T3> làm đối số , bạn có thể cung cấp thường trình khởi động của luồng với ba mục dữ liệu.

68

Một tuple cho phép bạn kết hợp nhiều giá trị của các loại có thể khác nhau vào một đối tượng duy nhất mà không cần phải tạo ra một lớp tùy chỉnh. Điều này có thể hữu ích nếu bạn muốn viết một phương thức ví dụ trả về ba giá trị liên quan nhưng bạn không muốn tạo một lớp mới.

Thông thường bạn nên tạo một lớp vì điều này cho phép bạn cung cấp tên hữu ích cho từng thuộc tính. Mã mà rộng rãi sử dụng các bộ sẽ nhanh chóng trở nên không thể đọc được vì các thuộc tính được gọi là Item1, Item2, Item3, vv ..

+28

Tôi sử dụng tối đa 2 giá trị và mỗi loại khác nhau, ví dụ: chuỗi, int. Nếu không nó đang trở thành mã tồi tệ nhất bạn có thể viết. – Ondra

+3

Giữ giới hạn sử dụng, có lẽ chỉ thích sử dụng riêng tư trong lớp/mô-đun. Ngoài ra, việc sử dụng Tuple có chứa các loại phức tạp ("Khách hàng", "Nhân viên", v.v.) có thể đơn giản hơn một chút so với nguyên thủy. Không có gì tệ hơn là cố gắng làm việc với rất nhiều Tuple s. –

16

lớp tuple cho phép các nhà phát triển phải được 'nhanh chóng và lười biếng' bằng cách không xác định một lớp học cụ thể cho sử dụng cụ thể.

Tên thuộc tính là Item1, Item2, Item3 ..., có thể không có ý nghĩa trong một số trường hợp hoặc không có tài liệu.

Lớp tuple có các thông số chung được nhập mạnh mẽ. Người dùng của các lớp Tuple có thể suy ra từ kiểu tham số chung.

+1

Vì vậy, có lẽ C# 7 nên đã làm cho nó dễ dàng hơn để tạo ra các lớp học/đối tượng trên bay thay vì điều tuple này? –

32

Sự khác biệt giữa một bộ tuple và một lớp là một bộ tuple không có tên thuộc tính. Điều này gần như không bao giờ là một điều tốt, và tôi sẽ chỉ sử dụng một tuple khi các đối số là khá vô nghĩa như trong một công thức toán học trừu tượng Ví dụ. phép tính trừu tượng trên 5,6,7 kích thước có thể lấy một tuple cho các tọa độ.

+1

Trong trường hợp này (có lẽ các loại giá trị giống nhau) sử dụng một mảng đơn giản là không đủ? Có một số lợi thế khi sử dụng Tuple? –

+0

Các kiểu có thể dễ dàng khác nhau, nhưng tôi đoán việc triển khai IComparable có thể là một lợi thế trong trường hợp đồng nhất đôi khi. Như bạn nói, tôi muốn được sử dụng một mảng cho các kịch bản đơn giản hơn. – Kaido

+0

Câu trả lời rất hay! –

20

Đây là điều quan trọng nhất cần biết về loại Tuple. Tuple là một lớp, không phải là một cấu trúc. Do đó, nó sẽ được phân bổ trên vùng quản lý. Mỗi cá thể lớp được phân bổ sẽ thêm vào gánh nặng của việc thu gom rác thải.

Lưu ý: Thuộc tính Item1, Item2 và hơn nữa không có trình cài đặt. Bạn không thể chỉ định chúng. Tuple là bất biến khi được tạo trong bộ nhớ.

+1

_ "Burden" _ - bạn đã bao giờ quan sát thấy một vấn đề thu gom rác thải chưa? – Gusdor

+3

Tuyệt đối! Hãy suy nghĩ về mã xử lý truyền thông mạng. Nó phân bổ và deallocating tấn bộ nhớ vì vậy mỗi vài phút GC đang chạy và có thể mất vài giây để hoàn thành. Điều này là không thể chấp nhận được nếu một cái gì đó ở hạ nguồn phụ thuộc vào dữ liệu đó trong thời gian thực. Ví dụ khác là thiết bị hạn chế tài nguyên, chẳng hạn như thiết bị di động, chạy ứng dụng thời gian thực, chẳng hạn như ứng dụng chỉ đường lái xe. – stuckintheshuck

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