• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[.NET 4.0]Giới thiệu Tuple trong .NET 4.0

Các bài viết hướng dẫn và tham khảo chung, không thuộc ngôn ngữ nào

Điều hành viên: vietluyen

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

[.NET 4.0]Giới thiệu Tuple trong .NET 4.0

Gửi bàigửi bởi neverland87 » T.Sáu 27/11/2009 3:07 pm

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:

Mã: Chọn hết

  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.  
  8.             PrintObjects((string)objects[0], (int)objects[1], (DateTime)objects[2]);
  9.         }
  10.  
  11.         static void PrintObjects(string str, int i, DateTime dt)
  12.         {
  13.             Console.WriteLine("{0} {1} {2}", str, i, dt.ToString());
  14.         }


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:

Mã: Chọn hết

  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.  
  8.             PrintObjects((string)objects[0], (int)objects[1], (DateTime)objects[2]);
  9.         }

Đ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

Mã: Chọn hết

  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.  
  6.             PrintObjects(tuple.Item1, tuple.Item2, tuple.Item3);
  7.         }

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:

Mã: Chọn hết

  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


Nguồn: MSDNVietNam.net


SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

Quay về “Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách