Trang chủ » CSharp » Giới thiệu Tuple trong .NET 4.0

Giới thiệu Tuple trong .NET 4.0


Trong phiên bản sắp phát hành Microsoft .NET Framework 4.0 sẽ xuất hiện một kiểu dữ liệu mới là System.Tuple. System.Tuple là một kiểu tập hợp có kích thước cố định được dùng để lưu trữ tập các đối tượng có kiểu dữ liệu khác nhau. Cũng giống như kiểu mảng trước đây, một tuple sẽ có kích thước cố định và không thể thay đổi sau khi được khởi tạo thành công. Điểm khác biệt so với kiểu mảng là mặc dù các phần tử trong tuple có thể có kiểu dữ liệu khác nhau nhưng mỗi phần tử trong tuple được đảm bảo về kiểu dữ liệu của mình. Để hiểu rõ hơn, hãy xét một ví dụ sau đây:

 

Code Snippet
  1. static void Main(string[] args)
  2.         {
  3.             object[] objects = new object[3];
  4.             objects[0] = "This is a string";
  5.             objects[1] = 1;
  6.             objects[2] = new DateTime(2009, 10, 24);
  7.             PrintObjects((string)objects[0], (int)objects[1], (DateTime)objects[2]);
  8.         }
  9.         static void PrintObjects(string str, int i, DateTime dt)
  10.         {
  11.             Console.WriteLine("{0} {1} {2}", str, i, dt.ToString());
  12.         }

Ví dụ trên tạo ra một mảng gồm 3 phần tử có kiểu là object. Thoạt nhìn, đoạn code trên không có vấn đề gì nảy sinh. Nhưng nếu xét về mặt an toàn kiểu dữ liệu (type safety) thì đoạn code trên mắc rất nhiều lỗi. Khi khai báo một mảng các object như vậy, thì ta có thể đưa vào đó bất kỳ thứ gì ta muốn và không thể kiểm soát được. Trong trường hợp, nếu như tại phần tử thứ 2, ta đưa vào là một chuỗi ký tự như sau:

Code Snippet
  1. static void Main(string[] args)
  2.         {
  3.             object[] objects = new object[3];
  4.             objects[0] = "This is a string";
  5.             objects[1] = "This is an another string";
  6.             objects[2] = new DateTime(2009, 10, 24);
  7.             PrintObjects((string)objects[0], (int)objects[1], (DateTime)objects[2]);
  8.         }

Đoạn code sau khi sửa xong vẫn sẽ biên dịch thành công. Nhưng khi gọi thực thi phương thức PrintObjects thì sẽ bị lỗi InvalidCastException khi thực hiện việc chuyển đổi chuỗi “This is an another string” sang kiểu số int.

Bây giờ, cùng ví dụ trên, nhưng ta sử dụng System.Tuple

Code Snippet
  1. static void Main(string[] args)
  2.         {
  3.             System.Tuple<string, int, DateTime> tuple = new Tuple<string, int, DateTime>
  4.             ("This is a string", 1, new DateTime(2009, 10, 24));
  5.             PrintObjects(tuple.Item1, tuple.Item2, tuple.Item3);
  6.         }

Với cách giải quyết vấn đề bằng việc sử dụng System.Tuple, ta có thể loại bỏ các phép toán “ép kiểu” (cast operators) ra khỏi chương trình, điều này giúp cho việc kiểm tra lỗi tại thời điểm biên dịch tốt hơn. Với ví dụ vừa nêu ở trên, ta thấy rằng System.Tuple là một kiểu dữ liệu hữu ích và cần phải có trong .NET Framework.

System.Tuple và KeyValuePair

Hãy xem một phương thức khởi tạo của Tuple như sau:

public static System.Tuple<T1,T2> Create<T1, T2>(T1 item1, T2 item2)

Từ các phiên bản trước của .NET Framework, đã có một kiểu dữ liệu có tên là KeyValuePair<Tkey, Tvalue> nằm trong namespace System.Collections.Generic. Cả hai kiểu Tuple<T1, T2> và KeyValuePair<Tkey, Tvalue> đều rất giống nhau. Thật ra, giữa Tuple<T1, T2> và KeyValuePair<Tkey, Tvalue> có khá nhiều điểm khác biệt. Đối với KeyValuePair<Tkey, Tvalue>, ngoài việc lưu trữ 2 thành phần Tkey và Tvalue, nó còn mang kèm cả “mối quan hệ” giữa 2 thành phần này – và cũng với lý do này, KeyValuePair<Tkey, Tvalue> được dùng trong Dictionary class. Bên cạnh đó, tuples khi khởi tạo có thể thay đổi được kích thước lưu trữ, còn đối với KeyValuePair thì mặc nhiên chỉ lưu trữ duy nhất 2 thành phần là Tkey và Tvalue.

Đối với System.Tuple, ta có các phương thức khởi tạo sau:

Code Snippet
  1.         Tuple <T1>
  2.         Tuple <T1, T2>
  3.         Tuple <T1, T2, T3>
  4.         Tuple <T1, T2, T3, T4>
  5.         Tuple <T1, T2, T3, T4, T5>
  6.         Tuple <T1, T2, T3, T4, T5, T6>
  7.         Tuple <T1, T2, T3, T4, T5, T6, T7>
  8.         Tuple <T1, T2, T3, T4, T5, T6, T7, TRest>

 

Tham khảo bài viết CLR Inside Out: Building Tuple tại http://msdn.microsoft.com/en-us/magazine/dd942829.aspx

Bình luận

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s