Search This Blog

Thursday, June 16, 2016

Partial Class trong C#

Partial Class là gì?

Partial Class trong .C# là một tính năng giúp chúng ta chia một class thành hai hay nhiều phần hay file khác nhau. Các phần hay file này chứa một phần tính năng của class đó, đó có thể là properties, methods...Tất cả những phần này, file này sẽ được tích hợp lại bên trong class khi chúng ta biên dịch (compile) chương trình.

Vậy khi nào chúng ta sử dụng Partial Class?

Partial Class sẽ rất hữu dụng khi chúng ta muốn:

- Cần bổ sung, cập nhật chức năng cho một class nhưng chúng ta không muốn hoặc không thể sửa đổi trực tiếp trong class này. Giả sử chúng ta có một class Convert bao gồm các method dùng chung trong hệ thống dùng để convert các kiểu dữ liệu. Sau một thời gian chúng ta muốn bổ sung thêm một vài method vào class Convert này mà không muốn phải tạo một class hoàn toàn mới thì Partial Class sẽ giải quyết vấn đề này cho chúng ta.

Ví dụ:
   /// <summary>  
   /// My first Convert class  
   /// </summary>  
   public static partial class MyConvert  
   {  
     public static int ToInt(string value)  
     {  
       return int.Parse(value);  
     }  
     //other methods  
   }  
   /// <summary>  
   /// My second Convert class  
   /// </summary>  
   public static partial class MyConvert  
   {  
     public static decimal ToDecimal(string value)  
     {  
       return decimal.Parse(value);  
     }  
   }  

Và kết quả sau khi compile: chúng ta có hai method bên trong class Convert dù được viết trong 2 class khác nhau.

- Chia để trị. Khi ta muốn chia class thành nhiều phần có mục đích rõ ràng: một phần dùng để kế thừa và thực thi các method của parent class hay interface, một phần khác thực thi các khai báo, method của riêng nó. Nó sẽ rất có ích nếu ta có một class lớn với hàng trăm, hàng ngàn dòng code hoặc ta có class mà nhiều người có thể thực thi cùng một lúc. Ví dụ điển hình là khi chúng ta design form trong C#, Visual Studio sẽ tách Form thành 2 file riêng biệt là "Form1.cs" xử lí nghiệp vụ, events...và "Form1.designer.cs" dùng để khai báo, thiết kế control.

Ví dụ: ta có một partial class Person dùng để khai báo các property và method của riêng nó, một partial class Person khác dùng để thực thi method Clone từ interface ICloneable.
 namespace chkien0911.PartialClass  
 {  
   public partial class Person  
   {  
     public string Name { get; set; }  
     public DateTime Birthday { get; set; }  
     public int GetAge()  
     {  
       return DateTime.Now.Year - Birthday.Year;  
     }  
   }  
   public partial class Person : ICloneable  
   {  
     /// <summary>  
     /// Implement interface's method  
     /// </summary>  
     /// <returns></returns>  
     public object Clone()  
     {  
       return this.MemberwiseClone() as Person;  
     }  
   }  
 }  

Kết quả sau khi compile:


Khi chúng ta sử dụng tính năng tạo code tự động mà làm các bổ sung của chúng ta bị mất đi. Lấy ví dụ như chúng ta sử dụng Entity Framework Database First để tạo một DbContext mapping với Database. Đôi khi chúng ta cần tạo lại DbContext để cập nhật cấu trúc mới nhất của Database, lúc này DbContext của chúng ta sẽ được tạo lại từ đầu, đồng thòi sẽ xóa tất cả những sự bổ sung trước đó của chúng ta vào DbContext này và chúng ta phải viết lại các bổ sung. Nếu bạn không muốn làm điều đó thường xuyên thì Partial Class sẽ rất hữu dụng cho chúng ta.

Một số điều lưu ý về Partial Class:

- Chúng ta phải sử dụng từ khóa partial trong mỗi Partial Class.
- Các Partial Class phải có cùng mức độ truy cập (public, protected, private...).
- Các Partial Class nên có cùng namespace.
- Các Partial Class phải nằm trong cùng assembly hoặc cùng module (.exe hay .dll).
- Nếu một phần là abstract hay sealed thì những phần kia cũng phải được khai báo abstract hay sealed.
- Nếu một phần đã kế thừa từ class khác hay interfaces thì những phần khác cũng hiểu là đã kế thừa từ class hay interfaces đó, do đó bạn không cần phải kế thừa lại.

Trên đây là một vài chia sẻ của tôi về Partial Class. Nếu có gì thắc mắc hay trao đổi, các bạn có thể comment bên dưới bài viết này.

Share to be shared.

1 comment: