Khóa học lập trình C# nâng cao

Khóa học lập trình C# nâng cao

Generic trong C# Generic trong C# Generic trong C# Generic trong C# Generic trong C# 5/5 (24 reviews)

Generic trong C#

Đã đăng 2017-11-25 02:30:34 bởi Kteam
0 bình luận 5212 lượt xem
Generic trong C# 5 /5 stars (1 reviews)
 

Dẫn nhập

Ở các bài học trước, chúng ta đã cùng nhau tìm hiểu về BITARRAY TRONG C#. Hôm nay chúng ta sẽ cùng tìm hiểu về Generic trong C#.


Nội dung

Để đọc hiểu bài này tốt nhất các bạn nên có kiến thức cơ bản về các phần:

Trong bài học này, chúng ta sẽ cùng tìm hiểu các vấn đề:

  • Generic là gì?
  • Một số loại Generic Collections thông dụng.

Generic là gì?

Nếu bạn đã từng học Lập trình C++ thì chắc hẳn bạn đã từng biết tới khái niệm Template (hay còn gọi là mẫu).

Template được dùng để tạo ra các lớp, các hàm mà không cần quan tâm đến đối số kiểu dữ liệu là gì. Template được đưa ra với mục đích tăng tính tái sử dụng lại mã nguồn.

Tượng tự Template của C++, Generic trong C# cho phép bạn định nghĩa một hàm, một lớp mà không cần chỉ ra đối số kiểu dữ liệu là gì. Tuỳ vào kiểu dữ liệu mà người dùng truyền vào thì nó sẽ hoạt động theo kiểu dữ liệu đó.

Ví dụ: bạn muốn hàm hoán đổi giá trị 2 số nguyên ta sẽ viết như sau:

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

Mọi thứ đều hoạt động tốt cho đến khi bạn hoán đổi 2 số thực. Khi đó bạn phải viết lại 1 hàm Swap mới với kiểu dữ liệu của tham số truyền vào là kiểu số thực.

Mặc dù thao tác giống nhau nhưng ta phải viết hàm này 2 lần. Chính vì vậy mà Generic ra đời để giúp chúng ta giảm thiểu việc code và tăng tính tái sử dụng.

Nếu sử dụng Generic ta sẽ viết như sau:

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

Bạn chỉ cần đặt 1 chữ cái nào đó thay cho kiểu dữ liệu và khi gọi hàm bạn chỉ ra kiểu dữ liệu bạn đang thao tác là gì. Ví dụ:

int a = 5, b = 7;
double c = 1.2, d = 5.6;

Swap<int>(ref a, ref b);
Swap<double>(ref c, ref d);

Khi bạn gọi Swap<int>(ref a, ref b) thì hàm Swap sẽ chạy và thay ký tự T thành kiểu dữ liệu int tương ứng.

Phía trên mình vừa giới thiệu về Generic cho phương thức. Tiếp theo là Generic cho lớp cũng tương tự.

Ví dụ:

public class MyGeneric<T>
{
    private T[] items;

    public T[] Items
    {
        get { return items; }
    }

    public MyGeneric(int Size)
    {
        items = new T[Size];
    }

    public T GetByIndex(int Index)
    {
        // Nếu index vượt ra khỏi chỉ số phần tử của mảng thì ném ra ngoại lệ
        if (Index < 0 || Index >= items.Length)
        {
            throw new IndexOutOfRangeException();
        }
        else
        {
            return items[Index];
        }
    }

    public void SetItemValue(int Index, T Value)
    {
        if (Index < 0 || Index >= items.Length)
        {
            throw new IndexOutOfRangeException();
        }
        else
        {
            items[Index] = Value;
        }
    }
}

Bạn cứ tưởng tượng bình thường bạn viết một lớp cho kiểu int, long, double gì đó thì giờ thay nó bằng T còn lại thao tác như bình thường.

Đến khi sử dụng thì ta truyền kiểu dữ liệu thích hợp vào. Ví dụ:

// Khởi tạo 1 mảng số nguyên kiểu int có 5 phần tử
MyGeneric<int> MyG = new MyGeneric<int>(5);

MyG.SetItemValue(0, 10);

Khi bạn khai báo MyGeneric<int> thì trình biên dịch sẽ hiểu T trong lớp MyGeneric là kiểu int và thay thế toàn bộ chữ cái T trong lớp thành int sau đó thực thi.


Đặc điểm của Generic

Giúp định nghĩa một thao tác dữ liệu với kiểu dữ liệu chung nhất nhìn hạn chế viết code và tái sử dụng.

Ứng dụng phổ biến nhất của Generic là tạo ra các Generic Collections.

  •  Ở những bài học trước ta đã tìm hiểu các Collections phổ biến thì nếu các bạn để ý giá trị lưu trữ bên trong đều là object.
  •  Điều này gây rất nhiều khó khăn nếu như ta muốn quản lý 1 danh sách có cùng kiểu. Vì object có thể chứa được mọi kiểu dữ liệu nên ta khó kiểm soát rằng việc thêm phần tử có phải cùng kiểu dữ liệu ta mong muốn hay không.
  •  Từ đó Generic Collections ra đời để giúp ta vừa có thể sử dụng được các Collections vừa có thể hạn chế lỗi xảy ra trong quá trình thực thi.

Ngoài ra, Generic còn giúp hạn chế truy cập nếu như không truyền đúng kiểu dữ liệu. Điều này sẽ được trình bày trong những bài học sau.

Trong series này mình sẽ không đào sâu về cách viết Generic mà thay vào đó sẽ giới thiệu cho các bạn một số Generic Collections phổ biến cũng như cách sử dụng chúng.


Một số loại Generic Collections thông dụng

Các Generic Collections đều được xây dựng bắt nguồn từ 1 Collections nào đó có sẵn. Vì thế với mỗi Collections đã học sẽ có một Generic tương ứng.

Một số Generic Collections được sử dụng phổ biến:

 


Kết luận

Nội dung bài này giúp các bạn nắm được:

  • Generic là gì?
  • Một số loại Generic Collections thông dụng.

Bài học sau chúng ta sẽ cùng tìm hiểu về LIST TRONG C#.

Cảm ơn các bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để phát triển bài viết tốt hơn. Đừng quên “Luyện tập – Thử thách – Không ngại khó”.

 


Tài liệu 

Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Generic trong C# dưới dạng file PDF trong link bên dưới.

Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com

Đừng quên like hoặc +1 Google để ủng hộ Kteam và tác giả nhé! 


Thảo luận

Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần BÌNH LUẬN bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng. 

 

Chia sẻ:
Thảo luận Hỏi và đáp Báo lỗi bài viết
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  
Hủy bỏ   hoặc  

Chiến dịch

Kteam - Howkteam Free Education