Generic trong C#



Generic trong C# cho phép bạn trì hoãn các đặc điểm kỹ thuật (Specification) của kiểu dữ liệu của việc lập trình các phần tử trong một lớp hoặc một phương thức, tới khi nó thực sự được sử dụng trong chương trình. Nói cách khác, Generic cho phép bạn viết một lớp hoặc phương thức mà có thể làm việc với bất kỳ kiểu dữ liệu nào.

Hiểu nôm na, đơn giản generic cũng là một kiểu dữ liệu trong C#, nó cũng như là int, float, string, bool, ..., nhưng điểm khác biệt ở đây, generic nó là một kiểu dữ liệu "tự do", nghĩa là nó có thể là kiểu dữ liệu nào cũng được, tùy vào mục đích sử dụng, nó như là 1 kiểu đại diện cho tất cả các kiểu dữ liệu còn lại.

Bạn viết các specification cho lớp và phương thức, với các tham số có thể thay thế cho các kiểu dữ liệu. Khi Compiler bắt gặp một constructor cho một lớp hoặc một lời gọi hàm cho phương thức, nó tạo code để xử lý kiểu dữ liệu cụ thể đó. Dưới đây là ví dụ đơn giản sẽ giúp bạn hiểu khái niệm này.

Bạn tạo hai lớp có tên lần lượt là TestGeneric, TestCsharp như sau:

Lớp TestGeneric:

using System;
using System.Collections.Generic;

namespace VietJackCsharp
{
    class TestGeneric <T>
    {
        private T[] array;
        public TestGeneric(int size)
        {
            array = new T[size + 1];
        }

        public T getItem(int index)
        {
            return array[index];
        }

        public void setItem(int index, T value)
        {
            array[index] = value;
        }
    }
}

Lớp TestCsharp:

using System;
using System.Collections;

namespace VietJackCsharp
{
    class TestCsharp
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Vi du minh hoa Generic trong C#");
            Console.WriteLine("-------------------------------------");
            
            //khai bao mot mang cac so nguyen
            TestGeneric<int> intArray = new TestGeneric<int>(5);
            //thiet lap cac gia tri
            for (int c = 0; c < 5; c++)
            {
                intArray.setItem(c, c * 5);
            }

            //lay va hien thi cac gia tri
            for (int c = 0; c < 5; c++)
            {
                Console.Write(intArray.getItem(c) + " ");
            }

            Console.WriteLine();

            //khai bao mot mang ky tu
            TestGeneric<char> charArray = new TestGeneric<char>(5);

            //thiet lap gia tri
            for (int c = 0; c < 5; c++)
            {
                charArray.setItem(c, (char)(c + 97));
            }

            //lay va hien thi cac gia tri
            for (int c = 0; c < 5; c++)
            {
                Console.Write(charArray.getItem(c) + " ");
            }
            Console.WriteLine();
         
            Console.ReadKey();
        }
    }
}

Nếu bạn không sử dụng lệnh Console.ReadKey(); thì chương trình sẽ chạy và kết thúc luôn (nhanh quá đến nỗi bạn không kịp nhìn kết quả). Lệnh này cho phép chúng ta nhìn kết quả một cách rõ ràng hơn.

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Generic trong C#
Quảng cáo

Đặc điểm của Generic trong C#

Generic là một kỹ thuật làm cho chương trình C# của bạn phong phú hơn theo các cách sau:

  • Nó giúp bạn tối đa hóa việc tái sử dụng của code, an toàn kiểu, và hiệu năng.

  • Bạn có thể tạo các lớp generic collection. Thư viện lớp của .Net Framework chứa một số lớp generic collection trong System.Collections.Generic namespace. Bạn có thể sử dụng các lớp generic collection này thay cho các lớp collection trong System.Collections namespace.

  • Bạn có thể tạo cho riêng mình các Class, Interface, phương thức, Event và Delegate dạng generic.

  • Bạn có thể tạo các lớp generic mà cho bạn khả năng truy cập tới các phương thức trên các kiểu dữ liệu cụ thể.

  • Bạn có thể lấy thông tin về các kiểu được sử dụng trong một kiểu dữ liệu generic tại runtime bởi các phương thức của Reflection.

Quảng cáo

Các phương thức Generic trong C#

Trong ví dụ trước, chúng ta đã sử dụng một lớp generic, tương tự, chúng ta có thể khai báo một phương thức generic với một tham số kiểu. Ví dụ sau minh họa điều này:

using System;
using System.Collections;

namespace VietJackCsharp
{
    class TestCsharp
    {
        static void Swap<T>(ref T lhs, ref T rhs)
        {
            T temp;
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Generic trong C#");
            Console.WriteLine("-------- Vi du trao doi gia tri ------");

            int a, b;
            char c, d;
            a = 10;
            b = 20;
            c = 'I';
            d = 'V';

            // Hien thi cac gia tri truoc khi trao doi:
            Console.WriteLine("Cac gia tri int truoc khi goi ham swap: ");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Cac gia tri char truoc khi goi ham swap:");
            Console.WriteLine("c = {0}, d = {1}", c, d);

            //goi ham swap de trao doi gia tri
            Swap<int>(ref a, ref b);
            Swap<char>(ref c, ref d);

            // Hien thi cac gia tri sau khi trao doi:
            Console.WriteLine("Cac gia tri int sau khi goi ham swap:");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Cac gia tri char sau khi goi ham swap:");
            Console.WriteLine("c = {0}, d = {1}", c, d);

            Console.ReadKey();
      }
    }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Generic trong C#
Quảng cáo

Generic Delegate trong C#

Trong C#, bạn có thể định nghĩa một Generic Delegate với các tham số kiểu. Ví dụ:

delegate T NumberChanger<T>(T n);

Ví dụ sau đây minh họa cách sử dụng của generic delegate trong C#:

using System;
using System.Collections;

delegate T NumberChanger<T>(T n);
namespace VietJackCsharp
{
    class TestCsharp
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Generic Delegate trong C#");
            Console.WriteLine("--------------------------------");

            //tao cac doi tuong delegate
            NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);
            NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);

            //goi hai phuong thuc boi su dung doi tuong delegate
            nc1(25);
            Console.WriteLine("1 - Gia tri cua num la: {0}", getNum());
            nc2(5);
            Console.WriteLine("2 - Gia tri cua num la: {0}", getNum());
            Console.ReadKey();
        }
    }
}

Biên dịch và chạy chương trình C# trên sẽ cho kết quả sau:

Generic trong C#

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Các bạn có thể mua thêm khóa học JAVA CORE ONLINE VÀ ỨNG DỤNG cực hay, giúp các bạn vượt qua các dự án trên trường và đi thực tập doanh nghiệp với Java. Khóa học có giá chỉ 400K, nhằm ưu đãi, tạo điều kiện cho sinh viên cho thể mua khóa học.

Nội dung khóa học gồm 16 chuơng và 100 video cực hay, học trực tiếp tại https://www.udemy.com/tu-tin-di-lam-voi-kien-thuc-ve-java-core-toan-tap/ Bạn nào có nhu cầu mua, inbox trực tiếp chị Thu, trợ lý anh Tuyền để hỗ trợ thanh toán qua mã QR ngân hàng Việt Nam, fb: https://www.facebook.com/Thule.59

Anh Tuyền, tác giả khóa học, là cựu sinh viên chương trình đào tạo kĩ sư tài năng của đại học Bách Khoa Hà Nội với hơn 5 năm kinh nghiệm đi làm thực tế doanh nghiệp và cũng là Founder website vietjack.com, web giáo dục phổ biến nhất Việt Nam hiện tại (năm 2024). Java cũng là ngôn ngữ lập trình dễ đi xin việc nhất hiện tại, với mức lương cao, hãy nâng cao kiến thức IT của bản thân mình vì một Việt Nam giàu mạnh.

Loạt bài hướng dẫn của chúng tôi dựa một phần trên nguồn tài liệu của: Tutorialspoint.com




Tài liệu giáo viên