C# Overview
Định nghĩa (Definition)
C# (đọc là "C sharp") là một ngôn ngữ lập trình hiện đại, đa dụng, hướng đối tượng (Object-Oriented) do Anders Hejlsberg thiết kế tại Microsoft và được phát hành năm 2000 như một phần của sáng kiến .NET. Nó được tiêu chuẩn hóa dưới ECMA-334 và ISO/IEC 23270. C# là ngôn ngữ chính để xây dựng ứng dụng trên nền tảng .NET — bao gồm Web API, ứng dụng desktop, ứng dụng mobile, game (Unity), dịch vụ đám mây, và nhiều hơn nữa.
Các khái niệm cốt lõi (Core Concepts)
Đặc điểm chính (Key Characteristics)
| Đặc điểm | Mô tả |
|---|---|
| Kiểu mạnh (Strongly-typed) | Mọi biến và biểu thức đều có kiểu được xác định tại thời điểm biên dịch |
| Hướng đối tượng (Object-oriented) | Hỗ trợ đóng gói (Encapsulation), kế thừa (Inheritance), đa hình (Polymorphism) và trừu tượng hóa (Abstraction) |
| An toàn kiểu (Type-safe) | Ngăn chặn ép kiểu không an toàn và đảm bảo an toàn bộ nhớ |
| Thu gom rác (Garbage-collected) | Quản lý bộ nhớ tự động thông qua .NET GC |
| Quản lý (Managed) | Chạy trên CLR; runtime xử lý bộ nhớ, bảo mật và luồng (Threading) |
| Hướng thành phần (Component-oriented) | Thuộc tính (Properties), sự kiện (Events), thuộc tính mở rộng (Attributes) và delegate hỗ trợ thiết kế dựa trên thành phần |
Cấu trúc chương trình (Program Structure)
Một chương trình C# truyền thống được tổ chức thành không gian tên (Namespaces), lớp (Classes) và phương thức (Methods):
using System; // Using directive — imports a namespace
namespace MyApplication // Namespace — organizes types
{
class Program // Class — container for data and behavior
{
static void Main(string[] args) // Entry point — where execution begins
{
Console.WriteLine("Hello, World!");
}
}
}
Các thành phần cấu trúc chính:
- Chỉ thị
using— nhập không gian tên (Namespace) để không cần sử dụng tên đầy đủ (Fully Qualified Name). - Không gian tên (Namespaces) — nhóm logic các kiểu liên quan.
- Lớp (Classes) — bản thiết kế cho đối tượng; đơn vị cơ bản của OOP trong C#.
- Phương thức
Main— điểm khởi đầu của ứng dụng (Entry Point). Có thể trả vềvoidhoặcint.
Câu lệnh mức cao nhất (Top-Level Statements) (C# 9+)
Kể từ C# 9, bạn có thể viết chương trình mà không cần lớp (Class) và phương thức Main mẫu:
// This IS a complete C# program (C# 9+)
using System;
Console.WriteLine("Hello, World!");
Trình biên dịch tự động tạo lớp Program và phương thức Main. Chỉ một tệp trong dự án có thể sử dụng câu lệnh mức cao nhất (Top-Level Statements).
Sử dụng câu lệnh mức cao nhất (Top-Level Statements) cho các ứng dụng console đơn giản, script và học tập. Đối với các ứng dụng lớn hơn với nhiều kiểu, cấu trúc namespace/class truyền thống sẽ rõ ràng hơn.
Quá trình biên dịch (Compilation Process)
Mã C# đi qua nhiều giai đoạn trước khi thực thi:
- Mã nguồn (Source Code) (tệp
.cs) được biên dịch bởi Roslyn (trình biên dịch C#). - Roslyn phát ra Ngôn ngữ trung gian (Intermediate Language - IL) được tập hợp thành
.dllhoặc.exe. - Trong thời gian chạy, CLR (Common Language Runtime) sử dụng trình biên dịch JIT (JIT Compiler) để chuyển đổi IL thành mã máy gốc (Native Machine Code).
- Mã máy gốc thực thi trên bộ xử lý.
Mã chạy trên CLR được gọi là mã quản lý (Managed Code) — runtime xử lý bộ nhớ (GC), an toàn kiểu (Type Safety) và bảo mật. Mã không quản lý (Unmanaged Code) (ví dụ: C/C++ qua P/Invoke) chạy ngoài CLR và không chịu các biện pháp bảo vệ này.
Tóm tắt lịch sử phiên bản C# (C# Version History Highlights)
| Phiên bản | Năm | Tính năng chính |
|---|---|---|
| C# 1.0 | 2002 | Managed code, classes, structs, interfaces, delegates, events |
| C# 2.0 | 2005 | Generics, partial classes, nullable types, anonymous methods |
| C# 3.0 | 2007 | LINQ, lambda expressions, extension methods, anonymous types, auto-properties |
| C# 4.0 | 2010 | Dynamic binding (dynamic), named/optional arguments, covariance |
| C# 5.0 | 2012 | async/await, caller info attributes |
| C# 6.0 | 2015 | String interpolation, null-conditional operator, expression-bodied members |
| C# 7.0–7.3 | 2017–18 | Pattern matching, tuples, out variables, local functions, ref return |
| C# 8.0 | 2019 | Nullable reference types, switch expressions, async streams, indices/ranges |
| C# 9.0 | 2020 | Top-level statements, records, init-only setters, pattern matching enhancements |
| C# 10.0 | 2021 | Global usings, file-scoped namespaces, record structs, constant interpolated strings |
| C# 11.0 | 2022 | Raw string literals, required members, generic math, list patterns |
| C# 12.0 | 2023 | Primary constructors for classes, collection expressions, inline arrays |
| C# 13.0 | 2024 | params collections, ref struct improvements, partial properties |
Mối quan hệ giữa C# và .NET (How C# Relates to .NET)
C# là một ngôn ngữ (Language); .NET là nền tảng (Platform) mà C# chạy trên đó.
- CLR (Common Language Runtime) — công cụ thực thi (Execution Engine) (GC, JIT, hệ thống kiểu).
- BCL (Base Class Library) — thư viện chuẩn cung cấp collections, I/O, threading, v.v.
- SDK — công cụ và trình biên dịch để xây dựng ứng dụng .NET.
- Các ngôn ngữ khác (F#, VB.NET) cũng biên dịch thành IL và chạy trên cùng CLR.
Ví dụ mã (Code Examples)
Cấu trúc chương trình truyền thống (Traditional Program Structure)
using System;
using System.Collections.Generic;
namespace OrderProcessing
{
class Program
{
static int Main(string[] args)
{
var orders = new List<string> { "Order-001", "Order-002" };
foreach (var order in orders)
{
Console.WriteLine($"Processing {order}");
}
return 0; // Exit code
}
}
}
Câu lệnh mức cao nhất (Top-Level Statements) (C# 9+)
using System;
using System.Collections.Generic;
var orders = new List<string> { "Order-001", "Order-002" };
orders.ForEach(order => Console.WriteLine($"Processing {order}"));
Không gian tên phạm vi tệp (File-Scoped Namespace) (C# 10+)
namespace OrderProcessing; // File-scoped — applies to entire file
class OrderService
{
public void Process(string orderId)
{
Console.WriteLine($"Processing {orderId}");
}
}
Khi nào sử dụng (When to Use)
| Tình huống | Khuyến nghị |
|---|---|
| Web API & backend | C# + ASP.NET Core — tiêu chuẩn ngành |
| Ứng dụng desktop | WPF, WinForms, hoặc MAUI |
| Phát triển game | Unity sử dụng C# làm ngôn ngữ kịch bản (Scripting Language) |
| Đám mây / Serverless | Azure Functions, AWS Lambda hỗ trợ C# |
| Ứng dụng mobile | .NET MAUI (đa nền tảng) |
| Học khái niệm OOP | C# rõ ràng, tài liệu tốt và thân thiện với người mới |
Lỗi thường gặp (Common Pitfalls)
- Nhầm lẫn C# và .NET — C# là ngôn ngữ; .NET là runtime và thư viện. Bạn có thể viết ứng dụng .NET bằng F# hoặc VB.NET.
- Cho rằng C# giống hệt Java — Mặc dù tương tự về cú pháp, C# có thuộc tính (Properties), delegate, kiểu giá trị (Struct), LINQ, kiểu tham chiếu nullable (Nullable Reference Types) và nhiều tính năng mà Java không có hoặc thêm sau này.
- Bỏ qua kiểu tham chiếu nullable (Nullable Reference Types) (C# 8+) — Kích hoạt
<Nullable>enable</Nullable>trong dự án mới. Nó phát hiện lỗi liên quan đến null tại thời điểm biên dịch. - Sử dụng các mẫu code cũ — Ưu tiên expression-bodied members, pattern matching và switch expressions thay vì các mẫu C# 1.0–5.0 dài dòng.
Tóm tắt要点 (Key Takeaways)
- C# là một ngôn ngữ đa mô hình hiện đại do Microsoft thiết kế và được ECMA tiêu chuẩn hóa.
- Nó biên dịch thành IL (Intermediate Language) mà CLR JIT-biên dịch thành mã gốc (Native Code) trong thời gian chạy.
- Ngôn ngữ đã phát triển đáng kể — từ ngôn ngữ OOP giống Java (C# 1.0) đến ngôn ngữ hiện đại với pattern matching, async và các tính năng hàm (Functional Features) (C# 13).
- C# là ngôn ngữ chính (nhưng không phải duy nhất) của hệ sinh thái .NET.
Câu hỏi phỏng vấn (Interview Questions)
Q: C# là gì và nó khác Java như thế nào?
C# là một ngôn ngữ hướng đối tượng, an toàn kiểu hiện đại của Microsoft chạy trên .NET CLR. Điểm khác biệt chính so với Java: C# có thuộc tính (Properties - không cần getter/setter methods), kiểu giá trị (Struct), delegate và sự kiện (Events), LINQ, kiểu tham chiếu nullable (Nullable Reference Types), nạp chồng toán tử (Operator Overloading) và
async/await(Java thêm sau dưới dạng virtual threads). C# cũng có chu kỳ phát hành nhanh hơn.
Q: Mã quản lý (Managed Code) là gì?
Mã quản lý (Managed Code) là mã chạy trên CLR. Runtime cung cấp quản lý bộ nhớ tự động (thu gom rác - Garbage Collection), xác minh an toàn kiểu (Type Safety Verification), xử lý ngoại lệ (Exception Handling) và dịch vụ bảo mật. Mã không quản lý (Unmanaged Code) (ví dụ: C++ qua P/Invoke) chạy ngoài CLR mà không có các biện pháp bảo vệ này.
Q: Sự khác biệt giữa C# và .NET là gì?
C# là ngôn ngữ lập trình — cú pháp, từ khóa, tính năng ngôn ngữ. .NET là nền tảng: runtime (CLR), thư viện lớp cơ bản (Base Class Library - BCL) và SDK/công cụ. C# biên dịch thành IL mà .NET runtime thực thi. Các ngôn ngữ khác như F# và VB.NET cũng nhắm đến .NET.