Friday, March 11, 2011

Dynamic trong C# 4 - Phần 1

Từ khóa dynamic và Dynamic Language Runtime (DLR) là những tính năng mới trong C# 4 và Microsoft .NET Framework 4. Bài viết này cung cấp những cái nhìn khái quát về tính năng dynamic trong C# 4.

Dynamic là gì?

C# và Java thường được xem là ngôn ngữ lập trình tĩnh, trong khi Python, Ruby và JavaScript là những ví dụ của ngôn ngữ động.
Thông thường, ngôn ngữ động không thực hiện kiểm tra kiểu tại thời điểm biên dịch chương trình và chỉ nhận dạng kiểu đối tượng tại thời điểm chạy chương trình. Điều này giúp cho việc viết code đơn giản và nhanh hơn, nhưng lúc đó bạn không nhận được lỗi biên dịch và chỉ đến khi thực hiện kiểm thử rất cẩn thận mới đảm bảo được chương trình bạn được viết chính xác.
Trong C# 4, từ khóa dynamic đã được bổ sung để cải thiện khả năng tương thích với các ngôn ngữ và nền tảng (framework) động..
Dưới đây là ví dụ về việc sử dụng từ khóa dynamic:

static void ChangeDynamicDataType()
{
 dynamic t = "Hello!";
 Console.WriteLine("t is of type: {0}", t.GetType());

 t = false;
 Console.WriteLine("t is of type: {0}", t.GetType());

 t = new System.Collections.Generic.List();
 Console.WriteLine("t is of type: {0}", t.GetType());
}
Output:
t is of type: System.String
t is of type: System.Boolean
t is of type: System.Collections.Generic.List`1[System.Int32]

Như bạn thấy, nó có thể gắn với các đối tượng có kiểu dữ liệu khác nhau vào biến được khai báo dynamic. Đoạn code được biên dịch bình thường và được định danh tại thời điểm chạy (runtime). Tuy nhiên, đoạn code sau sẽ được biên dịch bình thường, nhưng sẽ xuất hiện ngoại lệ (exception) tại thời điểm chạy:

dynamic d = "Hello!";

//Dòng sau sẽ xuất hiện ngoại lệ thời điểm chạy.
d++;
Output:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException was unhandled
  Message=Operator '++' cannot be applied to operand of type 'string'
  Source=Anonymously Hosted DynamicMethods Assembly

Bởi vì trình biên dịch không thể biết kiểu của đối tượng tại thời điểm chạy và do đó không thể nói với bạn rằng thao tác '++' không được hổ trợ trong trường hợp này.

Sử dụng từ khóa dynamic, object hay var?

Vậy sự khác nhau giữa dynamic, object và var như thế nào và khi nào bạn nên dùng chúng?
Từ khóa object mô tả cho kiểu System.Object, là lớp cha trên cùng trong phân cấp lớp C#, và có thể diễn tả cho bất cứ lớp nào khác. Nó được sử dụng khi không thể định danh được kiểu đối tượng tại thời điểm biên dịch và bạn cần sử dụng lệnh chuyển đổi sang một kiểu định nghĩa trước nếu muốn sử dụng các phương thức hoặc thuộc tính của kiểu đó.

static void UseObjectVarible()
{
 // Giả sử có một lớp tên Person.
 object o = new Person() { FirstName = "Thanh", LastName = "Ho" };

 // Phải đổi kiểu đối tượng thành Person
 // để có thể sử dụng các thuộc tính của Person.
 Console.WriteLine("Person's first name is {0}", ((Person)o).FirstName);
}

Từ khóa var được đưa ra từ C# 3.0, được sử dụng đại diện các kiểu đã được định nghĩa sẳn hoặc kiểu nặc danh. Một biến được khai báo var sẽ được định danh kiểu tại thời điểm biên dịch và không thể thay đổi kiểu lúc runtime. Nếu trình biên dịch không thể xác định được kiểu, nó sẽ tạo ra lỗi biên dịch:

var varExample = 10;
Console.WriteLine(varExample.GetType()); // In ra System.Int32

//Biến varExample là kiểu System.Int32:
varExample = varExample + 10;

//Dòng này sẽ bị lỗi khi biên dịch và chỉ có thể gán giá trị số nguyên cho varExample:
varExample = "test";

Từ khóa dynamic, được giới thiệu trong C# 4, tạo ra các kịch bản khác dựa trên từ khóa object truyền thống nhưng đơn giản hơn trong viết và maintain code. Thực tế, kiểu dynamic sử dụng kiểu System.Object nhưng không như object, nó không đòi hỏi việc đổi kiểu lúc biên dịch, mà chỉ định danh thời điểm chạy:

static void UseDynamicVarible()
{
 // Giả sử có một lớp tên Person.
 dynamic p = new Person() { FirstName = "Thanh", LastName = "Ho" };

 //Có thể sử dụng các thuộc tính của Person mà không cần đổi kiểu.
 Console.WriteLine("Person's first name is {0}", p.FirstName);
}

Qua phần này, bạn có thể hiểu và sử dụng được từ khóa dynamic, một trong những tính năng mới của C# 4, Dynamic Language Runtime (DLR) sẽ được trình bày trong phần tiếp theo.

No comments:

Post a Comment