Partial class và Partial method trong C – tách file code | Tự học ICT

Partial class là gì

Video Partial class là gì

Các lớp từng phần và phương thức từng phần là hai kỹ thuật đặc biệt trong C # giúp bạn tách mã của cùng một lớp và phương thức thành các tệp mã nguồn khác nhau. Những kỹ thuật này được sử dụng rất nhiều cùng với trình tạo mã tự động của visual studio. Những thủ thuật này không khó, nhưng hơi kỳ quặc. Bài học này sẽ giải thích chi tiết các vấn đề liên quan cho bạn.

Các lớp một phần trong c #

Khái niệm lớp một phần

Trong các bài học cho đến nay, bạn đã tạo mỗi lớp trong một tệp có cùng tên với lớp đó. Đây là cách thông thường để tổ chức mã nguồn lớp, phổ biến trong tất cả các ngôn ngữ lập trình hướng đối tượng.

Bây giờ, hãy tưởng tượng một số tình huống khác.

Visual studio có thể tự động tạo mã để tạo nhiều lớp khác nhau. Ví dụ: nếu bạn học lập trình với các biểu mẫu cửa sổ, bạn sẽ thấy rằng khi bạn đặt điều khiển trên một biểu mẫu, trình thiết kế studio trực quan sẽ tự động tạo mã tương ứng. Vì vậy, bây giờ nếu bạn thêm mã của riêng mình theo cách thủ công vào tệp mã được tạo tự động đó, nếu biểu mẫu thay đổi, mã của bạn có thể bị mất (vì bạn không có quyền kiểm soát việc tạo mã được tạo tự động). Ngoài ra, mã được tạo tự động thường rất phức tạp. Thật khó để bạn theo dõi các mã được tạo tự động này.

Đây là trường hợp khi viết các biểu mẫu cửa sổ trong C # 1.0, không có khái niệm về lớp một phần.

Visual studio cũng có công cụ riêng có thể giúp tự động tạo mã từ các mẫu, được gọi là mẫu văn bản t4. Trình tạo mã tự động này được sử dụng rất nhiều, ví dụ: cho asp.net, Entity Framework. Nếu bạn viết mã của mình trong một tệp mã được tạo tự động, bạn có thể mất tất cả mã của mình mỗi khi bạn chạy nó.

Một nhu cầu đặc biệt nảy sinh từ tình huống trên: xây dựng một lớp trên nhiều tệp vật lý. Điều này giúp giải quyết các vấn đề trên. Các phần được tạo tự động được đặt trong một tệp riêng biệt. Phần bạn tự viết nằm trong một tệp khác. Thay đổi một người không ảnh hưởng đến người khác. C # gọi kiểu của lớp, được xây dựng trên nhiều lớp từng phần của tệp vật lý như vậy.

Các lớp một phần là một tính năng của c # cho phép một lớp được xác định trên nhiều tệp vật lý khác nhau. Trình biên dịch c # sẽ tự động nối các tệp mã nguồn này tại thời điểm biên dịch.

Các lớp một phần là các hàm dịch vụ hỗ trợ các công cụ thiết kế và tạo mã tự động.

Sử dụng các lớp từng phần trong các dự án c #

Hãy làm ví dụ sau. Thêm một dự án có tên là lớp một phần vào giải pháp. Thêm hai tệp nguồn student.model.cs và student.methods.cs vào dự án.

partial class trong c# project

Lần lượt viết code cho các file như sau:

Bạn nhận thấy các vấn đề sau:

Hai tệp nguồn student.model.cs và student.methods.cs đều chứa phần khai báo của lớp sinh viên trong cùng một lớp một phần không gian tên. Rõ ràng là điều này sẽ gây ra một cuộc xung đột tên. Tuy nhiên, khi bạn dịch chương trình, nó sẽ thành công.

Vấn đề là bạn gặp phải từ khóa một phần trước từ khóa lớp . Từ khóa this cho trình biên dịch C # biết rằng hai khai báo thuộc cùng một lớp sinh viên. Nó chỉ là mã được đặt trên hai tệp mã nguồn khác nhau. Khi dịch các chương trình, trình biên dịch c # sẽ tự động nối chúng thành một lớp duy nhất.

Vì c # hiểu rằng hai khai báo thuộc về một lớp, trong mã máy khách (phương thức chính), bạn có thể sử dụng các thành viên được khai báo trên cả hai tệp. Nói cách khác, mã máy khách không biết đây là lớp một phần hay lớp thông thường.

Một số vấn đề khi sử dụng các lớp từng phần trong c #

Có thể thấy rằng việc khai báo và sử dụng lớp part thực sự rất đơn giản về cú pháp và suy nghĩ:

  • Nếu bạn có nhiều phần tử khác nhau trong một lớp, nhưng phải thuộc cùng một lớp, bạn có thể sử dụng các lớp từng phần để tách các phần thành các tệp riêng biệt. Ví dụ, thiết kế biểu mẫu và trình xử lý sự kiện vốn đã khác nhau, nhưng phải thuộc cùng một lớp. Visual studio tự động tạo biểu mẫu dưới dạng một lớp từng phần.
  • Nếu có các thành phần mã trong một lớp thường xuyên dao động trong quá trình phát triển và có các thành phần ổn định, bạn cũng có thể cân nhắc tách chúng thành các tệp khác nhau để quản lý dễ dàng hơn. Trong số đó, thành phần dễ bay hơi để lại một tệp riêng biệt và thành phần ổn định để lại một tệp riêng biệt. Ví dụ, các thành phần trường, thuộc tính và phương thức khởi tạo thường cố định. Trong khi các phương thức thành viên thường không ổn định hơn. Bạn có thể chia mã của mình thành hai phần riêng biệt.
  • Nếu bạn sử dụng trình tạo tự động, hãy giữ lớp này làm lớp một phần. Có thể bạn cần thêm mã của riêng mình sau này.

Ngoài ra, hãy lưu ý các vấn đề sau khi sử dụng các lớp từng phần:

Đầu tiên, các tệp nguồn cho các lớp từng phần phải nằm trong cùng một tập hợp (trong cùng một dự án). Nếu bạn viết một thư viện lớp và biên dịch nó cho người khác sử dụng, điều này bao gồm cả việc xây dựng một lớp một phần. Người dùng của lớp này không thể sử dụng cơ chế lớp một phần để mở rộng thêm lớp một phần của bạn. Lý do rất đơn giản, một lớp một phần chỉ cần tách mã thành nhiều tệp riêng biệt để trình biên dịch tự thu thập. Khi một lớp từng phần được biên dịch, trình biên dịch không thể bao gồm mã khác.

Thứ hai, trong mỗi phần của mã của lớp từng phần, bạn không thể khai báo các thành viên trùng lặp. Lý do là, mặc dù được phân phối trong nhiều tệp nguồn khác nhau, một phần của một lớp một phần thuộc cùng một lớp. C # không cho phép khai báo nhiều thành viên giống nhau.

Thứ ba, mỗi phần của lớp phải có hai từ khóa từng phần . Tuy nhiên, các bổ ngữ ( public | internal ) chỉ cần được viết một lần. Lớp cơ sở hoặc giao diện mà lớp này kế thừa chỉ cần được viết một lần.

Các phương thức từng phần trong c #

Các khái niệm về phương pháp từng phần

Các lớp một phần có thể chứa các loại thành viên đặc biệt mà các lớp thông thường không có: Phương thức một phần . Tương tự như các lớp từng phần, các phương thức từng phần cũng được thiết kế để hỗ trợ tạo mã tự động. Phương thức một phần tồn tại kể từ c # 3.0 và được coi là một phần mở rộng cho lớp một phần (nó đã tồn tại từ c # 2.0).

Phương thức một phần

cho phép mã được tạo tự động gọi phương thức, nhưng không nhất thiết phải xây dựng phương thức. Vì vậy, một số phương thức chỉ chứa chữ ký (mô tả) và không có phần thực thi (phần thân, phần thực hiện). Nếu không tìm thấy triển khai phương thức từng phần, trình biên dịch sẽ bỏ qua lệnh gọi phương thức từng phần.

Một số phương thức cũng thường gọi hooks . Nếu được gắn vào tệp thực thi, hook sẽ được gọi giống như một phương thức bình thường. Trình biên dịch bỏ qua hook này nếu không có tệp thực thi.

Các cơ chế trên giúp giảm kích thước mã trong khi vẫn đảm bảo tính linh hoạt.

Sử dụng một số phương pháp trong c #

Hãy làm một ví dụ với một số phương thức trong một lớp một phần. Chúng tôi lặp lại ví dụ trên với một số thay đổi nhỏ:

Trong quá trình dịch và kiểm tra, chương trình sẽ báo lỗi khi gặp lệnh gán một chuỗi trống cho tên đầu tiên khi khởi tạo đối tượng sinh viên.

Trong ví dụ trên, trong tệp student.model.cs, chúng tôi đã chuyển đổi họ và tên thành một thuộc tính đầy đủ với hai trường hỗ trợ _firstname và _lastname.

Bạn khai báo hai phương pháp từng phần onsettingfirstname và onsettinglastname:

Bạn gọi hai phương thức từng phần trong bộ thiết lập của hai thuộc tính tương ứng:

Trong tệp student.methods.cs, bạn triển khai hai phương pháp từng phần này:

Logic của các phương thức này rất đơn giản: nếu giá trị được gán cho họ hoặc tên chứa khoảng trắng hoặc là một chuỗi trống, thì một ngoại lệ sẽ được ném ra. Để thực hiện, bạn chạy mã máy khách như trên, chương trình sẽ báo lỗi và mở lại giao diện mã ngay lập tức.

Trong ví dụ trên, giả định rằng student.model.cs được tạo tự động. Rõ ràng, bạn không muốn cố định logic xác thực họ và tên, nhưng hãy để người dùng thực hiện logic của riêng họ.

Vì vậy, bạn khai báo hai phương thức từng phần và đặt hai móc nối (hai lệnh gọi phương thức từng phần) tại chỗ. Phần thân của phương thức part (chứa logic để kiểm tra giá trị họ và tên) là để người lập trình ghi vào tệp student.methods.cs.

Câu móc này là vô nghĩa nếu lập trình viên không tự viết phần triển khai. Trình biên dịch bỏ qua các cuộc gọi móc. Nếu lập trình viên viết phần thực thi, hook sẽ thực thi giống như một phương thức bình thường.

Những lưu ý khi sử dụng các phương thức từng phần trong c #

Phương thức

chỉ có thể được sử dụng trong các lớp từng phần. Một số phương thức không thể được sử dụng trong các lớp thông thường.

Các phương thức từng phần bao gồm ba phần (thường nằm trong các tệp khác nhau): phần khai báo, phần sử dụng (gọi phương thức) và phần thực thi.

Khai báo phương thức một phần phải bắt đầu bằng từ khóa part , kết thúc bằng dấu chấm phẩy sau danh sách tham số và không có nội dung.

Các lệnh gọi phương thức từng phần không khác với các phương thức thành viên thông thường.

Việc thực thi thường được đặt trong một tệp mã khác. Việc triển khai hoàn toàn giống như xây dựng phương pháp thông thường, nhưng sử dụng từ khóa part ở đầu. Ngoài ra, việc thực hiện và khai báo phải có chữ ký giống nhau.

Kiểu trả về của phương thức một phần phải là void và không được có tham số out . Tuy nhiên, nếu bạn cần duy trì các thay đổi tham số, thì tham số ref vẫn có sẵn. Một số phương thức không được sử dụng các công cụ sửa đổi quyền truy cập, chẳng hạn như công khai, riêng tư, bảo vệ. Các bổ ngữ khác như ảo, trừu tượng, niêm phong, v.v. cũng không được phép.

Nếu không tìm thấy triển khai nào, trình biên dịch sẽ bỏ qua một số lệnh gọi phương thức (như thể không có gì!).

Kết luận

Các lớp từng phần và các phương thức từng phần là hai khái niệm rất cụ thể trong C # được thiết kế để hỗ trợ tạo mã tự động. Khi xây dựng các lớp, bạn có thể sử dụng các tính năng này ít thường xuyên hơn. Tuy nhiên, nếu bạn đi sâu vào một số công nghệ phát triển ứng dụng trong .NET (như các biểu mẫu cửa sổ, khung thực thể), bạn sẽ sử dụng nó rất nhiều.

+ Nếu bạn thấy trang web hữu ích, vui lòng trợ giúp trang web trước khi bạn rời đi để nó có thể phát triển và phục vụ bạn tốt hơn. + Nếu bạn thấy bài viết này hữu ích. Hữu ích, hãy giúp chia sẻ với mọi người. + Nếu có thắc mắc hoặc cần trao đổi thêm, vui lòng ghi vào phần Thảo luận ở cuối trang. Cảm ơn!