Tản mạn C#: Kiến trúc căn bản
C# là ngôn ngữ lập trình hướng đối tượng dựa trên cú pháp của C, C++ và Java. Tuy nhiên, dù đã quen với C++ thì khi chuyển sang C#, ta cũng sẽ ít nhiều gặp vài bất ngờ. Điển hình là sự khác biệt giữa class
và struct
. Trong C++, sự khác biệt này không đáng kể và có phần hơi “nhảm”: các phần tử của struct mặc định sẽ public
, còn của class mặc định là private
. Vậy chỉ cần tạo một class
và cho tất cả member thành public
thì nó sẽ như một struct
. Trong C#, struct
(kiểu value) và class
(kiểu reference) rất khác biệt. Nếu hiểu được sự khác nhau giữa struct
và class
thì coi như ta đã hiểu được 50% các vấn đề trong C#.
Mã C# sau khi được biên dịch sang Intermediate Language (tương tự bytecode của Java) để tạo assembly (thuật ngữ để chỉ file exe
hay dll
) thì sẽ được biên dịch lần hai sang mã máy (machine code) khi chạy trên máy người dùng thông qua trình biên dịch gọi là Just-in-time compiler (Jitter). Quá trình này được quản lý bởi Common Language Runtime (CLR). Do vậy, ứng dụng .NET là ứng dụng có “mã được quản lý” (managed code).
Một trong những ưu điểm của môi trường managed code là công việc quản lý bộ nhớ được thực hiện tự động. Với những chương trình lớn thì việc cấp phát bộ nhớ là một gánh nặng và thường tạo ra memory leak (dân C++ hiểu quá rõ vấn đề này). Do đó, với sự trợ giúp của CLR thông qua “bộ thu gom rác” (garbage collector), lập trình viên C# được giải phóng khỏi nhiệm vụ quản lý bộ nhớ rườm rà, nhàm chán. Cái hay của garbage collector là nó tự động phát hiện những object trong bộ nhớ không còn được dùng và giải phóng chúng trong trường hợp cấp thiết mà không cần lập trình viên can thiệp.
Tuy C# lấy cảm hứng từ C và C++ nhưng cú pháp của nó được cải tiến trở nên gọn nhẹ hơn nhiều. Ta không phải ngụp lặn trong một đống con trỏ (pointer) như trong C++. Thay vào đó, ta dùng kiểu tham chiếu (reference). Một trong những bài học đầu tiên trong C# là phân biệt kiểu giá trị (value type) và kiểu tham chiếu (reference type). Điều này liên quan mật thiết với khái niệm struct và class như đã trình bày ở đầu bài: Class là kiểu tham chiếu, còn Struct là kiểu giá trị. Nếu bạn chỉ muốn nhớ duy nhất một thứ từ bài viết này thì tôi muốn bạn nhớ câu vừa rồi. Khi tạo một class, ta biết nó có kiểu reference và sẽ nằm trên heap. Khi tạo một struct, ta biết nó có kiểu value và nằm trên stack (ngoại trừ trường hợp kiểu value là field của class). Với C++, ta có thể cho class hoặc struct nằm trên stack hay heap tùy ý. Trong C#, ta không được quyền lựa chọn như vậy.
Để lập trình C# thì ta phải cài .NET Framework. Tuy C# có thể được biên dịch từ cửa sổ dòng lệnh nhưng làm vậy rất phiền phức. Nếu bạn muốn nghiên cứu sâu về C# thì nên cài Visual Studio. Khi phân phối chương trình, máy người dùng phải cài sẵn .NET Framework. Điều này có thể gây phiền toái cho người không chuyên. Tuy nhiên, các bản Windows sau Vista đều có sẵn .NET Framework.
Để thành thạo C#, ta phải làm hai việc: Học ngôn ngữ và nghiên cứu Base Class Library (BCL). Do BCL khá lớn, ta không thể nhớ hết cách sử dụng của từng class. Lúc này, ta phải cầu cứu đến MSDN. Tôi luôn bật sẵn MSDN để tiện tra cứu trong lúc code.