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) Kiểu vô danh và dynamic §10) Biểu thức lambda §11) Event §12) Hàm hủy - Quá tải toán tử - thành viên tĩnh - indexer §13) Lớp lồng nhau - namespace §14) null và nullable §15) Mảng §16) Chuỗi ký tự §17) Tính kế thừa §18) Tính đa hình - abstract - interface §19) Struct và Enum §20) Ngoại lệ Exeption §21) IDisposable - using §22) File cơ bản §23) FileStream §24) Generic §25) Collection - List §26) SortedList §27) Queue / Stack §28) Linkedlist §29) Dictionary - HashSet §30) Phương thức mở rộng §31) ObservableCollection §32) LINQ §33) (Multithreading) async - bất đồng bộ §34) Type §35) Attribute Annotation §36) DI Dependency Injection §37) (Multithreading) Parallel §38) (Networking) HttpClient §39) (Networking) HttpMessageHandler §40) (Networking) HttpListener §41) (Networking) Tcp TcpListenerr/TcpClient §42) (ADO.NET) SqlConnection §43) (ADO.NET) SqlCommand §44) (EF Core) Tổng quan §45) (EF Core) Tạo Model §46) (EF Core) Fluent API §47) (EF Core) Query §48) (EF Core) Scaffold §49) (EF Core) Migration §50) (ASP.NET CORE) Hello World! §51) (ASP.NET CORE) Middleware §52) (ASP.NET CORE) Map - Request - Response §53) (ASP.NET CORE) IServiceCollection - MapWhen §54) (ASP.NET CORE) Session - ISession §55) (ASP.NET CORE) Configuration §56) (ASP.NET CORE MVC) Controller - View

Phương thức với kiểu Generic

Generic (kiểu đại diện) - là cách thức cho phép sử dụng code trên nhiều loại kiểu dữ liệu cụ thể khác nhau. Ta đã quen với việc code trên những kiểu dữ liệu cụ thể int, float, double ... hay các class do bạn định nghĩa ...

Hãy xem hàm đổi giá trị cho nhau của hai biến tham chiếu:

public static void Swap(ref int a, ref int b) {
    int c = a;
    a = b;
    b = c;
}

Hàm này đổi giá trị của hai biến kiểu int, nếu muốn thực hiện trên biến kiểu double, string ... thì bạn lại cần viết các hàm Swap trên những kiểu đó.

Với những trường hợp như vậy, logic giống nhau trên những kiểu dữ liệu khác nhau thì sẽ dùng đến Generic, thay vì viết code trên kiểu dữ liệu cụ thể thì code trên những kiểu chung chung.

Bạn khai báo phương thức có sử dụng kiểu Generic bằng cách viết tên kiểu Generic, tên này là các ký hiệu do bạn đặt như A, B, T, ..., tên này viết sau tên hàm đặt trong < ... >

X MyFunction<X, Y>(X x, Y y)
{
   return x;
}

Khai báo phương thức MyFunction trên - nó cho biết sẽ sử dụng hai kiểu đại diện, kiểu đó đặt tên là XY do khai báo có <X,Y>. Khi đã có kiểu Generic rồi thì dùng kiểu này cho các thành phần của phương thức - như kiểu trả về là X, tham số là kiểu XY

Khi có phương thức Generic, sử dụng thì chỉ việc thay X, Y bằng kiểu cụ thể muốn áp dụng

Áp dụng xây dựng hàm Swap ở trên:

static void Swap<T>(ref T a, ref T b)
{
    T c = a;
    a = b;
    b = c;
}

Khi sử dụng, bạn gọi phương thức chỉ việc thay chữ T bằng kiểu cụ thể muốn áp dụng

int a = 1;
int b = 2;
Swap<int>(ref a, ref b);      // Hàm trên kiểu int

string a1 = "A";
string b1 = "B";
Swap<string>(ref a1, ref b1); // Hàm trên kiểu string

Lớp với kiểu Generic

Tương tự như phương thức, cũng có thể khai báo lớp với Generic - bằng liệt tên các kiểu đại diện này sau khai báo tên lớp

class MyClass<X, Y> {
// ...
}

Xây dựng lớp với kiểu Generic phổ biến để triển khai nhiều loại giải thuật như hàng đợi Queue, Stack, Array ...

class MyClass<T>
{
    private T bien;

    public MyClass(T value)
    {
        bien = value;
    }

    public T genericMethod(T pr)
    {
        Console.WriteLine(pr);
        return bien;
    }

    public T thuoctinh { get; set; }
}

Ví dụ sử dụng

MyClass<double> myClass = new MyClass<double>(123.123);
myClass.TestMethod(123);
Đăng ký theo dõi ủng hộ kênh