My Opera is closing 3rd of March

Hoang Ha's Blog

Hoang Ha lives in HCMC, Viet Nam

Automatic Properties, Object Initializers, and Collection Initializers

,

Ngoài tất cả những chức năng mới tuyệt vời của framework và tool, một trong những thứ mà tôi nghĩ những nhà phát triển (của tất cả các kiểu ứng dụng .NET) sẽ thực sự cảm thấy thích thú với Orcas đó là một số những chức năng mới và những sự cải tiến trong cả VB và C#. Những sự thay đổi về ngôn ngữ sẽ mang lại sự hiệu quả và giảm thiểu việc viết mã.



New C# Language Feature: Automatic Properties

Hiện tại,nếu bạn là một nhà phát triển, bạn có thể viết các lớp dựa trên các thuộc tính cơ sở giống như đoạn mã dưới đây:
  public class Person 
    {

        private string _firstName;
        private string _lastName;
        private int _age;
        
        public string FirstName {

            get {
                return _firstName;
            }
            set {
                _firstName = value;
            }
        }

        public string LastName {

            get {
                return _lastName;
            }
            set {
                _lastName = value;
            }
        }        
        
        public int Age {

            get {
                return _age;
            }
            set {
                _age = value;
            }
        }
    } 



Bạn chú ý rằng, chúng ta không thực sự thêm bất kỳ nguyên lý nào trong getters/setters của các properties - thay vào đó, chúng ta chỉ get/set giá trị trực tiếp tới một field. Điều này không đề cập tới vấn đề mà chúng ta đang thảo luận - tại sao không sử dụng các field để thay thế các properties? Có một số lượng lớn downsides để trình bày các public field. Hai vấn đề lớn cần quan tâm:
  • Bạn không thể dễ dàng liên kết trở lại với các field.
  • Nếu bạn đưa ra các public field từ các lớp, bạn không thể thay đổi chúng tới các property trừ khi biên dịch lại các assembly.


Trình biên dịch mới của C# mà nó được gắn vào bên trong "Orcas" cung cấp một phương pháp linh hoạt nhằm làm cho mã của bạn ngắn gọn hơn trong khi vẫn giữ được sự uyển chuyển của các properties bằng việc sử dụng chức năng ngôn ngữ mới "automatic properties". Automatic properties cho phép bạn tránh phải khai báo một private field bằng tay và viết cấu trúc logic get/set -- thay vì vậy, trình biên dịch có thể tự động tạo ra các private field và những thao tác get/set mặc định cho bạn.

Ví dụ, sử dụng automatic properties bạn có thể viết lại đoạn mã trên như sau:
public class Person {
    
        public string FirstName {
            get; set;
        }

        public string LastName {
            get; set;
        }        
        
        public int Age {
            get; set;
        }
    } 



Hoặc Nếu bạn thực sự muốn ngắn gọn hơn, bạn có thể thu gọn mã như sau:
public class Person {
        public string FirstName { get; set; }
        public string LastName  { get; set; }        
        public int    Age       { get; set; }
    } 



Bạn có thể tải ví dụ tại đây: Auto_Properties.rar

Khi trình biên dịch C# "Orcas" bắt gặp một sự thực thi get/set property trống như đoạn mã trên, nó sẽ tự động tạo ra một private field bên trong lớp của bạn, và thực thi một public getter and setter tới private property đó. Tiện ích này xuất phát từ một sự kết hợp type-contract, lớp trông thật sự giống như nó đã thực hiện với sự thực thi đầu tiên của chúng ta ở trên. Điều này có nghĩa là -- không giống với các public fields -- Trong tương lai, bạn có thể thêm nguyên lý hợp lệ bên trong sự thực thi các thuộc tính mà không phải thay đổi bất kỳ thành phần bên trong mà có tham chiếu tới lớp của bạn.

New C# and VB Language Feature: Object Initializers

Các kiểu dữ liệu bên trong .NET Framework dựa nhiều vào việc sử dụng các properties. Khi minh họa cho một ví dụ cụ thể và sử dụng các lớp mới, chúng ta thường viết mã như sau:

   Person person = new Person();
   person.FirstName = "Scott";
   person.LastName = "Guthrie";
   person.Age = 32; 



Bạn đã bao giờ muốn viết đoạn mã trên ngắn gọn hơn không(có thể vừa vặn trên một dòng)? Với các trình biên dịch C# và VB "Orcas", bây giờ bạn có thể nắm bắt tiện ích của một ngôn ngữ đặc trưng tuyệt vời "syntactic sugar" được gọi là "object Initializers", cho phép bạn thực hiện điều này và viết lại đoạn mã trên như sau:
 Person person = new Person { FirstName="Scott", LastName="Guthrie", Age=32 }; 


Trình biên dịch sau đó sẽ tự động tạo ra mã thuộc tính setter thích hợp mà nó lưu trữ ngữ nghĩa giống với đoạn mã đã được viết ở trên.

Ngoài việc thiết lập các giá trị thuộc tính đơn giản khi khởi tạo một kiểu dữ liệu, chức năng object initializer cho phép chúng ta tùy chọn thiết lập cho các kiểu thuộc tính bên trong phức tạp hơn. Ví dụ, mỗi kiểu dữ liệu Person chúng ta đã định nghĩa ở trên cũng có một thuộc tính gọi là "Address" của kiểu dữ liệu "Address". Chúng ta có thể viết đoạn mã bên dưới để tạo một đối tượng mới "Person" và thiết lập các thuộc tính của của chúng như sau:
 Person person = new Person {
      FirstName = "Scott",
      LastName = "Guthrie"
      Age = 32,
      Address = new Address {
         Street = "One Microsoft Way",
         City = "Redmond",
         State = "WA",
         Zip = 98052
      }
   }; 


New C# and VB Language Feature: Collection Initializers

Object Initializers là tuyệt vời, và tạo ra nó một cách dễ dàng để thêm các đối tượng tới các tập hợp. Ví dụ, nếu muốn thêm 3 người tới một tập hợp danh sách dựa trên kiểu dữ liệu chung "Person", bạn có thể viết như sau:
List<Person> people = new List<Person>();
            
  people.Add( new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 } );
  people.Add( new Person { FirstName = "Bill", LastName = "Gates", Age = 50 } );
  people.Add( new Person { FirstName = "Susanne", LastName = "Guthrie", Age = 32 } );



Sử dụng chức năng mới Object Initializer tiết kiệm hơn 12 dòng mã với ví dụ này so với khi bạn viết với khi bạn sử dụng trình biên dịch C# 2.0.

Các trình biên dịch C# và VB "Orcas" cho phép bạn thậm trí còn đi xa hơn nữa, và bây giờ cũng hỗ trợ việc hỗ trợ "Collection initializers" cho phép bạn tránh phải thêm nhiếu câu lệnh, và thậm trí còn tiết kiệm việc gõ phím:
 List<Person> people = new List<Person> {
      new Person { FirstName = "Scott", LastName = "Guthrie", Age = 32 },
      new Person { FirstName = "Bill", LastName = "Gates", Age = 50 },
      new Person { FirstName = "Susanne", LastName = "Guthrie", Age = 32 }
   }; 


Kết luận:

As developers we now have a much more concise way to define objects, initialize them, and add them to collections. At runtime, the semantics will be exactly the same as with today's longer syntax (so you don't need to worry about behavior changes). But now you don't need to type as much, and your code can be more crisp and concise.(ScottGu's Blog)

VS 2008 Multi-Targeting Support

Write a comment

New comments have been disabled for this post.

February 2014
M T W T F S S
January 2014March 2014
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28