C# Cơ bản .NET Core §1 Cài đặt, chương trình C# đầu tiên §2 Biến, kiểu dữ liệu và nhập/xuất §3 Toán tử số học và gán §4 So sánh, logic và lệnh if, switch §5 Vòng lặp for, while §6 Phương thức - Method §7 Phương thức - Delegate §8 Lớp - Class §9 Namespace §10 Partial, Nested §11 Kiểu giá trị, tham chiếu §12 Kiểu vô danh và dynamic §13 Biểu thức lambda §14 Event §15 Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §16 null và nullable §17 Mảng §18 Chuỗi ký tự §19 Tính kế thừa §20 Phương thức khởi tạo §21 Tính đa hình - abstract - interface §22 Struct và Enum §23 Ngoại lệ Exeption §24 IDisposable - using §25 File cơ bản §26 FileStream §27 Generic §28 Collection - List §29 SortedList §30 Queue / Stack §31 Linkedlist §32 Dictionary - HashSet §33 Phương thức mở rộng §34 ObservableCollection §35 LINQ §36 (Multithreading) async - bất đồng bộ §37 Type §38 Attribute Annotation §39 DI Dependency Injection §40 (Multithreading) Parallel §41 Thư viện lớp §42 (Networking) HttpClient §43 (Networking) HttpMessageHandler §44 (Networking) HttpListener §45 (Networking) Tcp TcpListenerr/TcpClient §46 (ADO.NET) SqlConnection §47 (ADO.NET) SqlCommand §48 (EF Core) Tổng quan §49 (EF Core) Tạo Model §50 (EF Core) Fluent API §51 (EF Core) Query §52 (EF Core) Scaffold §53 (EF Core) Migration §54 (ASP.NET CORE) Hello World! §55 (ASP.NET CORE) Middleware §56 (ASP.NET CORE) Map - Request - Response §57 (ASP.NET CORE) IServiceCollection - MapWhen §58 (ASP.NET CORE) Session - ISession §59 (ASP.NET CORE) Configuration §60 (ASP.NET CORE) Gửi Mail §61 (ASP.NET RAZOR) Khởi tạo và Route §62 (ASP.NET RAZOR) Cú pháp Razor §63 (ASP.NET RAZOR) Layout trong ASP.NET Core §64 (ASP.NET RAZOR) Partial §65 (ASP.NET RAZOR) ViewComponent §66 (ASP.NET RAZOR) TagHelper §67 (ASP.NET RAZOR) PageModel §68 (ASP.NET RAZOR) Model Binding §69 (ASP.NET RAZOR) HTML Form, Validation §70 (ASP.NET RAZOR) Upload File §71 (ASP.NET RAZOR) HtmlHelper §72 (ASP.NET RAZOR) Entity Framework §73 (ASP.NET RAZOR) Paging §74 (ASP.NET RAZOR) Identity (1) - Register, Login, Logout §75 (ASP.NET RAZOR) Identity (2) Lockout, Reset Password §76 (ASP.NET RAZOR) Identity (3) Google Login §77 (ASP.NET RAZOR) Identity (4) Facebook Login §78 (ASP.NET RAZOR) Identity (5) profile, password, email ... §79 (ASP.NET RAZOR) Identity (6) Role §80 (ASP.NET RAZOR) Identity (7) Role-based Authorization §81 (ASP.NET RAZOR) Identity (8) RoleClaim §82 (ASP.NET RAZOR) Identity (9) Authorization Handler §83 (ASP.NET RAZOR) IAuthorizationService §84 (ASP.NET MVC) Controller - View §85 (ASP.NET MVC) MVC Route
Namespace (Bài trước)

Phân chia mã nguồn lớp (class, interface) ra thành nhiều file với Partial

Partial là kỹ thuật phân chia code lưu ở nhiều file mã nguồn khác nhau, khi biên dịch thì nó tổng hợp lại thành một. Kỹ thuật này dùng với từ khóa partial khi định nghĩa lớp, giao diện, struct.

Kỹ thuật phân chia code ra thành nhiều file bạn có thể gặp khi:

  • Dự án lớn, những lớp mà mã nguồn dài cần chia tách ra thành nhiều file có thể đơn giản là gộp các chức năng giống nhau thành một file, hoặc làm việc nhóm mỗi lập trình viên làm việc trên một file - sau đó khi biên dịch nó tự tổng hợp thành một class hoàn chỉnh
  • Khi làm việc với các IDE, nó có thể phát sinh code một cách tự động, code được thêm vào lớp được lưu ở một file mã nguồn khác mà không cần chỉnh sửa file code ban đầu (nếu lập trình C# WPF bạn nhận thấy IDE phát sinh nhiều thành phần giao diện ở dạng này)

Để phân chia lớp, bạn khai báo và định nghĩa các thành phần của lớp ở nhiều nơi khác nhau, với yêu cầu trong khai báo lớp cho thêm từ khóa partial, ví dụ một lớp có tên Product khai báo một cách thông thường như sau:

using System;

namespace CS007B_PARTIAL
{
    public class Product {

      public string Name { set; get;}

      public bool Order(int number = 0)
      {
        return true;
      }

      public int numberBrought()
      {
        return 100;
      }

    }
}

Giờ có thể tách định nghĩa lớp trên ra làm hai phần, một phần định nghĩa trong file Product1.cs và một phần trong Product2.cs, kết quả vẫn có lớp Product tương đương

Product1.cs

using System;

namespace CS007B_PARTIAL
{
    public partial class Product {
      public string Name { set; get;}

      public bool Order(int number = 0)
      {
        return true;
      }

    }
}

Product2.cs

using System;

namespace CS007B_PARTIAL
{
    public partial class Product {

        public int numberBrought()
        {
            return 100;
        }

    }
}

Bạn thấy lớp đã được định nghĩa ở hai nơi, yêu cầu dòng khai báo lớp ở cả hai nơi là có từ khóa partial, đồng thời cùng có khả năng truy cập giống nhau, như trên khai báo

Lưu ý khi dùng partial

Có một số quy tắc cần lưu ý khi bạn để code của một thành phần ở nhiều nơi với partial

Trong định nghĩa ở tất cả các phần phải có từ khóa partial, ví dụ sau là lỗi

public partial class A { }

public class A { }  // thiếu đánh dấu partial

Từ khóa partial có thể đặt ngay trước từ khóa class

Partial với các phương thức

Bạn cũng có thể dùng từ khóa partial trong khai báo các phương thức, tuy nhiên mục đích chỉ là chia chia làm hai nơi, một nơi như là khai báo một nơi là triển khai code, và phương thức phải trả về kiểu void. Ví dụ:

// file1.cs
partial void myMethod();

// file2.cs
partial void myMethod()
{
  // code triển khai
}

Partial Method thường sinh ra bởi việc sinh mã nguồn tự động khi dùng công cụ IDE

Lớp lồng nhau (kiểu Nested) trong C#

Trong C# nó cho phép bạn khai báo một lớp (class), giao diện (interface), cấu trúc (struct) trong thân một lớp khác - chúng được gọi là kiểu lồng nhau (Nested Type)

Ví dụ khai báo một lớp con trong một lớp khác

public class Container
{
    public class Nested
    {
        public Nested() { }
    }
}

Lớp Nested được khai báo, định nghĩa trong lớp Container, nếu phạm vị lớp public, thì bên ngoài sử dụng lớp con này bằng cách chỉ rõ Container.Nested

Container.Nested nested = new Container.Nested();

Ví dụ lớp lồng nhau

class MobileProduct {
    public Manufactory manufactory { set; get; }

    // Lớp Manufactory nằm trong MobileProduct 
    public class Manufactory {
      string address;
      public Manufactory (string address) {
        this.address = address;
      }
      public void ShowAddress () {
        Console.WriteLine (address);
      }
    }

    public void ProductInfo () {
      manufactory.ShowAddress ();
    }
}

Sử dụng:

MobileProduct product = new MobileProduct();
product.manufactory =  new MobileProduct.Manufactory("Abc ...");
product.ProductInfo();

Mã nguồn CS007B_PARTIAL, hoặc tải về tại ex007b

Đăng ký theo dõi ủng hộ kênh
Namespace (Bài trước)