C# (đọc là "C sharp") là ngôn ngữ lập trình đa dụng do một nhóm tại Microsoft dẫn dắt bởi Anders Hejlsberg thiết kế, phát hành lần đầu năm 2002. C# định kiểu tĩnh (mỗi biến có một kiểu được trình biên dịch kiểm tra trước khi chương trình chạy), hướng đối tượng (code được tổ chức thành các lớp) và được quản lý (bộ thu gom rác (garbage collector) tự giải phóng bộ nhớ cho bạn). C# hiện đại cũng vay mượn nhiều từ lập trình hàm: lambda, truy vấn LINQ, pattern matching và record bất biến.
Đây là một chương trình C# hoàn chỉnh. Nhấn Chạy:
Đầu ra:
Hello, Ada! It is 2026.
C# dùng để làm gì
C# là ngôn ngữ đa dụng nên có mặt trong hầu hết các loại phần mềm, nhưng phần lớn tập trung ở vài lĩnh vực:
- Game. Unity, một trong những game engine được dùng rộng rãi nhất, được lập trình bằng C#. Godot cũng hỗ trợ C#.
- Backend web. ASP.NET Core là framework web của .NET cho API, trang web và ứng dụng thời gian thực. Đây là một trong những framework web phổ biến nhanh nhất trong các benchmark công khai.
- Ứng dụng desktop. WPF và Windows Forms trên Windows, .NET MAUI và Avalonia trên nhiều nền tảng.
- Đám mây và dịch vụ. Azure Functions, background worker, microservice chạy trong container.
- Công cụ và tự động hóa. Công cụ dòng lệnh, script build, xử lý dữ liệu.
C# đặc biệt phổ biến ở các doanh nghiệp vận hành trên công nghệ Microsoft và trong các studio game. Ứng dụng di động có thể viết bằng .NET MAUI (kế nhiệm Xamarin), nhưng đó là mảng nhỏ hơn so với Kotlin hay Swift.
C# và .NET không phải là một
C# là ngôn ngữ. .NET là nền tảng chạy nó, gồm ba phần:
- Runtime (CLR). Trình biên dịch C# không tạo ra mã máy. Nó tạo ra Intermediate Language (IL), lưu trong các tệp
.dllhoặc.exe. Khi chương trình chạy, Common Language Runtime biên dịch IL đó thành mã máy ngay lúc cần (JIT), quản lý bộ nhớ bằng bộ thu gom rác và bảo đảm an toàn kiểu. - Thư viện lớp cơ sở. Collection, truy cập tệp, mạng, văn bản, ngày giờ, đa luồng: mọi thứ nằm dưới
System.*. - SDK. Lệnh
dotnetđể tạo, build, kiểm thử và chạy dự án.
Các ngôn ngữ khác cũng biên dịch ra cùng IL (F#, Visual Basic), vì vậy một chương trình C# có thể dùng thư viện viết bằng F#.
Nền tảng này có hai thế hệ. .NET Framework (từ 1.0 năm 2002 đến 4.8.1) chỉ chạy trên Windows và vẫn đang chạy nhiều ứng dụng cũ. .NET (gọi là .NET Core cho đến phiên bản 5) là bản kế nhiệm mã nguồn mở, đa nền tảng, chạy trên Windows, Linux và macOS. Dự án mới nhắm tới .NET; các bản phát hành số chẵn như .NET 8 và .NET 10 được hỗ trợ dài hạn ba năm.
Cấu trúc một chương trình C#
Một chương trình C# gồm các kiểu (lớp, struct, interface, enum, record) chứa các thành viên (field, thuộc tính, phương thức). Chương trình bắt đầu chạy từ một phương thức static tên là Main. Namespace gom các kiểu liên quan lại với nhau, còn chỉ thị using cho phép bạn gọi chúng bằng tên ngắn.
Đầu ra:
Maya: 21.00
Leo: 13.00
Ở đây đã thấy được vài điều: Order là một lớp có hai thuộc tính (Customer, Total), một hàm khởi tạo và một phương thức. decimal là kiểu dành cho tiền, và hậu tố m đánh dấu một literal decimal. var để trình biên dịch tự suy ra kiểu của biến cục bộ, còn List<Order> là một collection generic chỉ nhận đối tượng Order. Phần {order.Total:F2} bên trong $"..." định dạng số với hai chữ số thập phân.
Trong dự án thực tế, mỗi lớp thường nằm trong tệp riêng, và các tệp được biên dịch chung thành một assembly. Xem chi tiết ở lớp và đối tượng.
Định kiểu tĩnh trong thực tế
Trình biên dịch biết kiểu của mọi biểu thức, nên cả một nhóm lỗi lớn không bao giờ lọt vào chương trình đang chạy. Gán một chuỗi cho biến int, gọi một phương thức không tồn tại hay truyền đối số sai thứ tự đều báo lỗi ngay lúc biên dịch, chỉ rõ dòng có lỗi.
Đầu ra:
29.97
45
Kiểu dữ liệu còn giúp cả trình soạn thảo: tự động hoàn thành, đổi tên và "find all references" trong C# đều chính xác vì công cụ đọc cùng thông tin kiểu mà trình biên dịch dùng.
Các phiên bản C# và những gì chúng thêm vào
Từ C# 9 năm 2020, mỗi tháng 11 có một phiên bản mới ra mắt cùng một bản .NET mới; trước đó, cứ hai đến ba năm mới có một phiên bản. Mỗi phiên bản được thiết kế để code cũ vẫn biên dịch được, và các ngoại lệ hiếm hoi (như field trở thành từ khóa bên trong accessor của thuộc tính ở C# 14) đều được ghi lại là breaking change, nên một chương trình viết cho C# 2 gần như luôn biên dịch được nguyên vẹn đến ngày nay.
| Phiên bản | Năm | Bổ sung đáng chú ý |
|---|---|---|
| C# 2 | 2005 | Generic, kiểu giá trị nullable (int?), iterator (yield) |
| C# 3 | 2007 | LINQ, biểu thức lambda, var, object initializer, extension method |
| C# 4 | 2010 | dynamic, tham số tùy chọn và tham số có tên |
| C# 5 | 2012 | async và await |
| C# 6 | 2015 | Nội suy chuỗi $"...", nameof, toán tử null-conditional ?. |
| C# 7 | 2017 | Tuple, out var, pattern matching với is, dấu phân cách chữ số |
| C# 8 | 2019 | Kiểu tham chiếu nullable, switch expression, range s[1..4], ??=, async stream |
| C# 9 | 2020 | Record, accessor init, top-level statement, new() theo kiểu đích |
| C# 10 | 2021 | Global using, namespace phạm vi tệp, record struct |
| C# 11 | 2022 | Raw string literal """, thành viên required, list pattern |
| C# 12 | 2023 | Primary constructor cho lớp, collection expression [1, 2, 3] |
| C# 13 | 2024 | Collection params, kiểu System.Threading.Lock |
| C# 14 | 2025 | Extension member, từ khóa field trong thuộc tính |
Các phiên bản mới chủ yếu bớt đi phần code rườm rà. Chương trình dành cho C# 9 trở lên này dùng top-level statement (không có class Program, không có Main), một record và một switch expression:
// C# 9 and later, in a .NET 6+ project (implicit usings import System)
var order = new Order("Maya", 21.00m);
Console.WriteLine(Shipping(order));
static string Shipping(Order o) => o.Total switch
{
>= 50m => "free shipping",
>= 20m => "standard shipping",
_ => "shipping fee applies"
};
record Order(string Customer, decimal Total);
Cùng logic đó theo kiểu tường minh cũ hơn, biên dịch được trên C# 6 và mọi phiên bản sau:
Đầu ra:
standard shipping
Cả hai cách viết đều là C# hợp lệ. Bạn sẽ gặp kiểu tường minh cũ hơn trong code có sẵn, các bài hướng dẫn và dự án Unity, còn kiểu ngắn gọn trong các dự án .NET mới.
LINQ: truy vấn dữ liệu ngay trong ngôn ngữ
LINQ (Language Integrated Query, C# 3) là một trong những tính năng mà nhiều người nhắc đến khi giải thích vì sao họ thích C#. LINQ cho phép bạn lọc, sắp xếp, nhóm và biến đổi bất kỳ collection nào bằng một chuỗi phương thức:
Đầu ra:
95, 91, 88, 72
Average: 78.0
Best: 95
Cú pháp này dùng được cho list trong bộ nhớ, cho bảng cơ sở dữ liệu qua Entity Framework và cho XML. Xem thêm ở LINQ.
C# có phải ngôn ngữ đầu tiên tốt không?
C# đòi hỏi nhiều hơn Python ngay từ đầu: bạn khai báo kiểu, kết thúc câu lệnh bằng dấu chấm phẩy và đặt code trong lớp. Bù lại, trình biên dịch bắt lỗi sớm, công cụ (Visual Studio, VS Code, Rider) rất tốt, và các khái niệm áp dụng thẳng sang Java, TypeScript, Kotlin và C++. Nếu bạn muốn làm game Unity hoặc làm việc ở công ty dùng .NET, C# là lựa chọn hiển nhiên. Nếu mục tiêu của bạn là phân tích dữ liệu hay machine learning, Python có hệ sinh thái lớn hơn.
Để bắt đầu, cài .NET SDK và chạy dotnet new console, hoặc bắt đầu với Hello World và chạy các ví dụ ngay trên những trang này.
Câu hỏi thường gặp
C# là gì?
C# (đọc là "C sharp") là ngôn ngữ lập trình đa dụng, định kiểu tĩnh và hướng đối tượng do Microsoft tạo ra, phát hành lần đầu năm 2002. Mã nguồn C# được biên dịch sang một ngôn ngữ trung gian, rồi runtime .NET chuyển nó thành mã máy, với bộ nhớ được bộ thu gom rác quản lý. C# được dùng cho backend web, game Unity, ứng dụng desktop, dịch vụ đám mây và công cụ.
C# có phải là .NET không?
Không. C# là ngôn ngữ; .NET là nền tảng mà nó chạy trên đó: runtime (CLR), thư viện lớp cơ sở (System.Collections.Generic, System.IO, v.v.) và bộ công cụ SDK. F# và Visual Basic cũng chạy trên .NET, và mỗi phiên bản C# thường ra mắt cùng một phiên bản .NET (ví dụ C# 12 đi cùng .NET 8).
C# dùng để làm gì?
Web API và trang web với ASP.NET Core, game với Unity (ngôn ngữ scripting của Unity là C#), ứng dụng desktop Windows với WPF và WinForms, ứng dụng đa nền tảng với .NET MAUI, dịch vụ đám mây và Azure Functions, cùng các công cụ dòng lệnh. C# rất phổ biến trong phần mềm doanh nghiệp và các studio game.
C# có khó học không?
C# là ngôn ngữ đầu tiên ở mức độ vừa phải. Cú pháp theo kiểu C và chặt chẽ hơn Python, vì mỗi biến đều có kiểu được trình biên dịch kiểm tra, nhưng bộ nhớ được quản lý giúp bạn và thông báo lỗi rõ ràng. Phần lớn người mới bắt đầu có thể viết các chương trình console hữu ích sau vài tuần luyện tập.
C# có còn đáng học không?
Có. C# luôn nằm trong nhóm ngôn ngữ được dùng nhiều nhất trong các khảo sát lập trình viên, .NET là mã nguồn mở và đa nền tảng, và ngôn ngữ có phiên bản mới vào tháng 11 hằng năm. Đây là lựa chọn thực tế nếu bạn muốn làm game bằng Unity hoặc làm việc ở các công ty dùng công nghệ Microsoft.