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 (fan cuồng Java rất ghét C# vì họ cho rằng C# ăn cắp trắng trợn ý tưởng của 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#, sự khác biệt giữa struct (kiểu value) và class (kiểu reference) trở nên rất lớn và đây là cải tiến quan trọng của C#. Nếu hiểu được sự khác nhau giữa một struct và một class thì coi như ta đã hiểu được 50% các vấn đề trong C#.

Khi nói tới C# thì không thể không bàn tới .NET vì cặp đôi này sinh ra là dành cho nhau. Ta hãy tưởng tượng C# chính là cá, còn .NET chính là nước. Cá mà mang ra khỏi nước thì cá chết. C# mà mang ra khỏi .NET thì C# cũng toi, không thể chạy được. Nói cách khác, .NET là môi trường để thực thi C#. Mã C# sau khi được biên dịch sang Intermediate Language (tương tự bytecode của Java, thêm một lý do để fan Java ghét C#) để tạo thành một assembly (thuật ngữ dùng để chỉ các file exe hay dll) thì sẽ được biên dịch lần thứ hai sang mã máy khi chạy trên máy người dùng thông qua trình biên dịch đặc biệt gọi là Just-in-time compiler (Jitter). Quá trình biên dịch này được quản lý bởi Common Language Runtime (CLR), giúp phòng tránh những nguy hại mà chương trình có thể gây ra cho máy người dùng. Do vậy, khi lập trình cho .NET thì ta đang lập trình trong môi trườ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ác thao tác quản lý bộ nhớ được thực hiện hoàn toàn tự động. Với những ứng dụng đơn giản thì điều này không có gì to tát, nhưng đối 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 bất kì can thiệp nào của lập trình viên. Đây là điều đã khiến không ít người phải lòng C#, trong đó có tôi. Một khi đã chuyển qua C#, bạn sẽ không muốn sử dụng ngôn ngữ khác nữa.

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. Phân biệt rạch ròi giữa class và struct giúp đơn giản hóa thao tác khi lập trình. Khi tạo một class, ta biết chắc nó sẽ có kiểu reference và do đó, nó sẽ nằm trên heap. Khi tạo một struct, ta biết nó sẽ có kiểu value và nằm trên stack. Không giống như người anh em C++, trong đó 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 với C# thì ta cần phải cài đặt .NET Framework. Tại thời điểm viết bài này, phiên bản mới nhất là .NET Framework 4.5. Để viết C#, ta không cần Visual Studio vì C# có thể được biên dịch từ cửa sổ dòng lệnh (Command Prompt). Tuy nhiên, làm như vậy rất phiền phức. Do đó, nếu bạn muốn nghiên cứu sâu về C# thì nên cài đặt Visual Studio 2013, phiên bản mới nhất khi viết bài này. Khi phân phối chương trình, máy người dùng phải được cài sẵn phiên bản .NET Framework phù hợp. Điều này có thể gây ra một vài phiền toái cho người không chuyên. Tuy nhiên, các bản Windows sau Vista đều cung cấp .NET Framework kèm theo và nó sẽ tự động cập nhật qua Windows Update khi có bản mới trừ phi người dùng tắt tính năng này. Lúc đó, ta phải hướng dẫn họ download và cài đặt thủ công.

Để thành thạo C#, ta phải làm song song hai việc: Học các tính năng của ngôn ngữ và nghiên cứu các class có trong .NET Framework. Tập hợp các class này được gọi là Base Class Library (BCL). Nó là một thư viện chứa hàng ngàn class được Microsoft viết sẵn để ta sử dụng. Những class này bao gồm các tính năng từ cơ bản đến nâng cao, giúp lập trình viên giảm thời gian viết code. Do số lượng class trong 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 tài liệu nằm trên MSDN, trang web chứa mọi thứ về công nghệ Microsoft. Theo thói quen, tôi thường bật MSDN bên cạnh Visual Studio để tiện tra cứu trong quá trình viết code.