uocmo_kchodoi
Moderator
- Xu
- 132
Generic là 1 tính năng mới trong .NET Framework 2.0 và và được tích hợp sâu trong Common Language Runtime (CLR). Trong .NET Framework, Generic được giới thiệu là khái niệm về các kiểu tham số và được dùng để thiết kế class và phương thức nhằm để trì hoãn chỉ ra kiểu dữ liệu cho đến khi lớp hoặc phương thức được khai báo hoặc khởi tạo.
Ví dụ, bằng cách sử dụng tham số T là tham số chung, bạn có thể tạo 1 class duy nhất mà khi tham chiếu tới, bạn sẽ không gặp bất kỳ lỗi nào xảy ra trong lúc runtime khi ép kiểu hoặc boxing (chuyển giá trị từ value type sang reference type)
Sự ra đời của Generic
Rất nhiều người trong chúng ta sử dụng generic mà không biết rằng nó là generic. Ví dụ, khi muốn tạo 1 danh sách các học sinh, ta thường viết:
//Một list chứa các object là Student
List<Student> students = new List<Student>();
students.Add(new Student()); //Code đúng
students.Add(new Car()); //Compile lỗi
//Lấy học sinh đầu tiên.
//Compiler tự hiểu kết quả là Student
Student first = students.First();
Generics ở trong 2 dấu ngoặc nhọn đấy bạn <>.
Để dễ hiểu, ta hãy quay lại thời .NET 1.0, khi generic chưa xuất hiện:
//Không có generic
//Một list chứa các object
List students = new List();
students.Add(new Student()); //Compile bình thường
students.Add(new Car()); //Compile bình thường
//Lấy object đầu tiên, phải ép kiểu sang Student
Student first = (Student)students.First();
Không có generic, compiler không thể check lỗi lúc compiler. Do đó, ở dòng 2, ta có thể thêm 1 object Car và list gồm các object Student. Khi lấy 1 phần tử ra, ta cũng phải ép kiểu, vì compiler chỉ hiểu nó là 1 object. Vì những lý do đó, generic đã được thêm vào ở .NET 2.0.
Tác dụng của generic:
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:
Ví dụ, bằng cách sử dụng tham số T là tham số chung, bạn có thể tạo 1 class duy nhất mà khi tham chiếu tới, bạn sẽ không gặp bất kỳ lỗi nào xảy ra trong lúc runtime khi ép kiểu hoặc boxing (chuyển giá trị từ value type sang reference type)
Sự ra đời của Generic
Rất nhiều người trong chúng ta sử dụng generic mà không biết rằng nó là generic. Ví dụ, khi muốn tạo 1 danh sách các học sinh, ta thường viết:
//Một list chứa các object là Student
List<Student> students = new List<Student>();
students.Add(new Student()); //Code đúng
students.Add(new Car()); //Compile lỗi
//Lấy học sinh đầu tiên.
//Compiler tự hiểu kết quả là Student
Student first = students.First();
Generics ở trong 2 dấu ngoặc nhọn đấy bạn <>.
Để dễ hiểu, ta hãy quay lại thời .NET 1.0, khi generic chưa xuất hiện:
//Không có generic
//Một list chứa các object
List students = new List();
students.Add(new Student()); //Compile bình thường
students.Add(new Car()); //Compile bình thường
//Lấy object đầu tiên, phải ép kiểu sang Student
Student first = (Student)students.First();
Không có generic, compiler không thể check lỗi lúc compiler. Do đó, ở dòng 2, ta có thể thêm 1 object Car và list gồm các object Student. Khi lấy 1 phần tử ra, ta cũng phải ép kiểu, vì compiler chỉ hiểu nó là 1 object. Vì những lý do đó, generic đã được thêm vào ở .NET 2.0.
Tác dụng của generic:
- Giúp tái sử dụng code. Ví dụ: Ta chỉ cần viết class List<T>, T ở đây có thể là bất kì class gì.
- Hỗ trợ compiler bắt lỗi trong quá trình compiler (Hạn chế được tình trạng như dòng 2).
- Không còn phải ép kiểu từ object.
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:
Nguồn: Sưu tầm
Sửa lần cuối bởi điều hành viên: