Bài giảng C# căn bản và nền tảng .NET Framework - GV. Ngô Chánh Đức

Tài liệu bài giảng Lập trình ứng dụng quản lý 1 học kỳ 1 về C# .NET cơ bản. Tổng hợp kiến thức nền tảng và bài tập thực hành dành cho sinh viên CNTT.

Chuyên ngành

Lập trình ứng dụng quản lý 1

Người đăng

Ẩn danh

Thể loại

Bài giảng
53
0
0

Phí lưu trữ

30 Point

Tóm tắt

I. Tổng quan về nền tảng C

.NET Framework ra đời vào năm 2002 cùng bộ công cụ Visual Studio .NET. Đây là môi trường thực thi ứng dụng hiện đại do Microsoft phát triển. Nền tảng hoạt động dựa trên máy ảo Common Language Runtime (CLR). CLR chịu trách nhiệm nạp mã, biên dịch Just-In-Time và quản lý bộ nhớ tự động. Thư viện lớp cơ sở cung cấp hơn 5000 lớp đối tượng đa năng. Lập trình viên dễ dàng xây dựng ứng dụng Console, WinForms, WPF và ASP.NET. Ngôn ngữ C# xuất hiện lần đầu vào năm 2000. Đây là ngôn ngữ hướng đối tượng mạnh mẽ, an toàn kiểu và kế thừa cú pháp từ C++. Tập tin mã nguồn C# mang phần mở rộng .cs. Mã nguồn được biên dịch thành mã trung gian Microsoft Intermediate Language (MSIL). Các thành phần kiến trúc bao gồm Namespace, Type, Member và Assembly. Quy trình phát triển diễn ra mượt mà trong Visual Studio với các chế độ Debug và Release. Hệ thống hỗ trợ đặt điểm dừng breakpoint, theo dõi biến và gỡ rối chi tiết. Lập trình C# .NET basic tạo nền móng vững chắc cho môn học Lập trình ứng dụng quản lý 1.

1.1. Kiến trúc và cơ chế thực thi của .NET Framework

Kiến trúc .NET Framework bao gồm hai thành phần cốt lõi: CLR và Thư viện lớp cơ sở BCL. Khi một chương trình C# khởi chạy, trình biên dịch csc chuyển đổi mã nguồn thành tập tin thực thi chứa mã MSIL và metadata. CLR tiếp nhận tập tin này rồi dùng trình biên dịch JIT để dịch MSIL sang mã máy bản địa. Cơ chế này đảm bảo tính độc lập phần cứng và tăng cường bảo mật thực thi. Hệ thống còn tích hợp Garbage Collector để tự động thu hồi bộ nhớ không còn sử dụng. Khả năng tương thích giữa các ngôn ngữ thuộc họ .NET giúp tối ưu hóa quá trình tích hợp module trong các dự án phần mềm quy mô lớn.

1.2. Môi trường phát triển và cấu trúc chương trình C

Visual Studio đóng vai trò là môi trường tích hợp phát triển (IDE) chính cho lập trình C#. Một chương trình C# cơ bản bắt đầu từ cấu trúc namespace, chứa các định nghĩa lớp class và phương thức static Main. Namespace ngăn chặn sự xung đột tên giữa các thư viện lập trình. Phương thức Main giữ vai trò là điểm nhập cảnh duy nhất khi ứng dụng bắt đầu thực thi. Visual Studio cung cấp hai cấu hình chính là Debug và Release. Chế độ Debug hỗ trợ gỡ rối với công cụ Breakpoint, Step In, Step Over và cửa sổ Watch để kiểm tra giá trị biến trong thời gian thực. Cấu hình Release tối ưu hóa kích thước và hiệu suất trước khi triển khai sản phẩm.

II. Phân tích kiểu dữ liệu và vấn đề ép kiểu C

C# phân chia hệ thống kiểu dữ liệu thành hai nhóm chính: kiểu giá trị (Value Type) và kiểu tham chiếu (Reference Type). Kiểu giá trị lưu trữ trực tiếp dữ liệu trên vùng nhớ Stack. Các kiểu số nguyên bao gồm sbyte, short, int, long có dấu và byte, ushort, uint, ulong không dấu. Kiểu số thực dấu phẩy động gồm float, double và kiểu số thực chính xác cao decimal. Kiểu tham chiếu lưu trữ địa chỉ con trỏ trên Stack trong khi dữ liệu thực nằm trên bộ nhớ Heap. Việc chuyển đổi qua lại giữa hai nhóm kiểu này phát sinh hiện tượng Boxing và Unboxing. Quá trình Boxing đóng gói một giá trị vào đối tượng tham chiếu, gây tiêu tốn bộ nhớ Heap. Ngược lại, Unboxing giải nén đối tượng về kiểu giá trị ban đầu và tiềm ẩn nguy cơ ném biệt lệ InvalidCastException nếu sai kiểu. Ngoài ra, việc ép kiểu thu hẹp (explicit casting) giữa các kiểu số có thể gây tràn số nếu giá trị vượt quá giới hạn miền lưu trữ. Cơ chế Nullable Value Type cho phép biến giá trị nhận trạng thái null nhưng yêu cầu kiểm tra kỹ lưỡng trước khi truy xuất giá trị để tránh NullReferenceException.

2.1. Phân biệt kiểu giá trị kiểu tham chiếu và rủi ro bộ nhớ

Sự khác biệt căn bản giữa kiểu giá trị và kiểu tham chiếu nằm ở vị trí cấp phát ô nhớ. Kiểu giá trị gồm struct và các kiểu dữ liệu nguyên thủy, được tạo trực tiếp trên Stack với vòng đời ngắn. Khi truyền tham số kiểu giá trị, hệ thống sao chép toàn bộ nội dung dữ liệu sang ô nhớ mới. Kiểu tham chiếu bao gồm class, interface, delegate và string, cấp phát trên Heap và quản lý qua biến con trỏ trên Stack. Việc tạo quá nhiều đối tượng tham chiếu ngắn hạn gây áp lực lớn lên bộ thu gom rác CLR Garbage Collector, dẫn tới hiện tượng phân mảnh bộ nhớ và suy giảm tốc độ xử lý của ứng dụng.

2.2. Vấn đề ép kiểu dữ liệu và xử lý giá trị Nullable

Ép kiểu trong C# chia làm hai dạng: ép kiểu ngầm định (implicit) và tường minh (explicit). Ép kiểu ngầm định diễn ra an toàn khi chuyển từ kiểu dữ liệu hẹp sang kiểu rộng hơn. Ép kiểu tường minh đòi hỏi toán tử chỉ định kiểu cụ thể và dễ gây mất mát dữ liệu do tràn số. Kiểu Nullable (cú pháp T?) cho phép gán giá trị null cho kiểu giá trị thông thường. Tuy nhiên, nếu truy xuất thuộc tính .Value khi biến đang mang giá trị null, chương trình sẽ lập tức ném ra ngoại lệ InvalidOperationException. Cần sử dụng toán tử kiểm tra null ?? hoặc toán tử điều kiện null ?. để xử lý an toàn.

III. Phương pháp lập trình và xử lý cấu trúc trong C basic

Để xây dựng chương trình C# chuẩn mực, lập trình viên cần làm chủ các cấu trúc điều khiển, xử lý chuỗi và quản lý tham số phương thức. Cấu trúc rẽ nhánh gồm if...else, switch...case và toán tử ba ngôi ?:. Vòng lặp for, foreach, while và do...while hỗ trợ duyệt dữ liệu linh hoạt kết hợp cùng lệnh break hoặc continue. Trong xử lý văn bản, kiểu string là bất biến (immutable). Mọi thao tác nối chuỗi bằng toán tử cộng chuỗi thông thường đều tạo ra các đối tượng mới trên bộ nhớ Heap. Giải pháp tối ưu là sử dụng lớp StringBuilder để ghép chuỗi trong các vòng lặp lớn, hoặc dùng kỹ thuật String Interpolation $ cho cú pháp ngắn gọn. Đối với phương thức, C# cung cấp từ khóa out và ref để truyền tham số theo dạng tham chiếu, cho phép hàm trả về nhiều giá trị đầu ra. Từ khóa params cho phép truyền số lượng đối số không cố định vào phương thức dưới dạng mảng một cách linh hoạt. Việc tuân thủ quy chuẩn viết mã (coding convention) như đặt dấu ngoặc khối lệnh rõ ràng và đặt tên biến chuẩn xác giúp tăng độ tin cậy của mã nguồn.

3.1. Kỹ thuật xử lý chuỗi và tối ưu hóa bộ nhớ với StringBuilder

Chuỗi ký tự trong C# được khai báo bằng từ khóa string và hỗ trợ nhiều ký tự thoát escape code như \n, \t, \ hay ký tự nguyên văn @. Định dạng chuỗi có thể thực hiện thông qua hàm String.Format hoặc String Interpolation để chèn trực tiếp biểu thức vào chuỗi mẫu. Tuy nhiên, do tính chất bất biến của chuỗi, thao tác cộng chuỗi lặp lại nhiều lần sẽ liên tục phân bổ bộ nhớ mới trên Heap và tạo gánh nặng dọn rác. Sử dụng đối tượng StringBuilder từ không gian tên System.Text giải quyết triệt để vấn đề này nhờ cơ chế cấp phát bộ đệm động, giúp chỉnh sửa nội dung chuỗi tại chỗ mà không tạo thêm đối tượng rác.

3.2. Quản lý mảng dữ liệu và tham số phương thức nâng cao

Mảng trong C# là tập hợp các phần tử có cùng kiểu dữ liệu, được đánh chỉ số từ 0. Ngôn ngữ hỗ trợ mảng một chiều, mảng nhiều chiều cố định (multi-dimensional array) và mảng so le (jagged array). Khi định nghĩa phương thức, việc kiểm soát cách thức truyền tham số đóng vai trò then chốt. Tham số mặc định truyền theo kiểu giá trị bản sao. Sử dụng từ khóa out yêu cầu phương thức phải gán giá trị cho biến trước khi trả về, rất hữu ích khi hàm cần xuất ra nhiều kết quả. Từ khóa params cho phép truyền danh sách tham số có độ dài tùy ý mà không cần khởi tạo mảng thủ công ở lời gọi hàm.

IV. Kết luận và ứng dụng thực tiễn của C

Nắm vững kiến thức C# .NET basic là bước đệm quan trọng trong toàn bộ chương trình môn học Lập trình ứng dụng quản lý 1. Nền tảng này trang bị tư duy lập trình cấu trúc, kỹ năng gỡ rối phần mềm và khả năng quản lý tài nguyên hệ thống tối ưu. Từ các khái niệm căn bản về kiểu dữ liệu, hàm và cấu trúc rẽ nhánh, sinh viên có thể nhanh chóng làm chủ các mô hình lập trình nâng cao hơn. C# cung cấp hệ sinh thái toàn diện để phát triển các loại hình ứng dụng đa dạng trong doanh nghiệp. Lập trình viên dễ dàng xây dựng phần mềm quản lý kho, hệ thống bán hàng trên WinForms và WPF hoặc phát triển dịch vụ web trên ASP.NET. Việc áp dụng đúng coding convention giúp mã nguồn trong sáng, dễ bảo trì và thuận lợi khi làm việc nhóm. Sự kết hợp giữa môi trường .NET Framework mạnh mẽ và ngôn ngữ C# hiện đại mang lại hiệu suất phát triển vượt trội cho mọi giải pháp phần mềm quản lý.

4.1. Ứng dụng C .NET trong xây dựng phần mềm quản lý

C# và .NET Framework cung cấp nền tảng vững chắc để xây dựng các giải pháp quản lý doanh nghiệp. Công nghệ WinForms và WPF hỗ trợ thiết kế giao diện đồ họa trực quan, gắn kết dữ liệu hai chiều và xử lý sự kiện người dùng mượt mà. Trong các hệ thống phần mềm quản lý như quản lý bán lẻ, quản lý nhân sự hay kho vận, C# cho phép kết nối cơ sở dữ liệu nhanh chóng và an toàn. Khả năng đóng gói thư viện DLL (Class Library) giúp tái sử dụng các mô-đun nghiệp vụ qua nhiều dự án khác nhau, tiết kiệm đáng kể thời gian phát triển và kiểm thử.

4.2. Quy chuẩn viết mã và phương pháp tối ưu hóa dự án

Việc áp dụng coding convention chuẩn xác là tiêu chí bắt buộc khi triển khai các dự án C# quy mô lớn. Các khối lệnh if, for, while luôn cần khoảng trắng phân tách và cặp ngoặc nhọn bao quanh rõ ràng nhằm tránh lỗi logic phát sinh. Bên cạnh đó, việc quản lý chặt chẽ cấu hình biên dịch Release giúp tối ưu hóa hiệu năng và loại bỏ thông tin gỡ rối thừa. Các kỹ thuật như giải phóng tài nguyên không dùng, tái sử dụng bộ đệm chuỗi và kiểm soát ngoại lệ chặt chẽ sẽ đảm bảo ứng dụng vận hành ổn định, đáp ứng tiêu chuẩn chất lượng cao trong môi trường sản xuất thực tế.

Tóm tắt và mô tả trên trang này được tạo với sự hỗ trợ của AI. Nếu bạn thấy nội dung không chính xác hoặc có vấn đề, vui lòng Báo lỗi nội dung.

15/06/2026
Ltudql1 hk1 1718 lt 01 csharp net basic

Trích đoạn nội dung tài liệu

C# căn bản Lập trình ứng dụng quản lý 1 Ngô Chánh Đức Nội dung .NET Framework C# cơ bản Coding convention .NET Framework Giới thiệu  Ra đời năm 2002 cùng với bộ công cụ lập trình Visual Studio .NET  Sử dụng kỹ thuật hướng đối tượng  Hỗ trợ chuẩn Unicode  Thi hành trên máy ảo CLR (Common Language Runtime)  Bao gồm hơn 5000 lớp đối tượng  Cung cấp bộ trình điều khiển đồ sộ (giao diện đồ họa)  Hỗ trợ dịch vụ quản lý bộ nhớ và nhiều dịch vụ khác Kiến trúc .NET Framework Cơ chế thực thi Kiến trúc .NET Framework Ứng dụng .NET Framework  Ứng dụng dòng lệnh (Console Application)  Ứng dụng WinForm (Windows Form Application)  Ứng dụng WPF (WPF Application)  Ứng dụng web (ASP.NET Web Form Application)  Thư viện DLL (Class Library) Đọc thêm  Kiến trúc .NET Framework: http://www.com/UploadFile/puranindia/net-framework- and-architecture/ C# căn bản Giới thiệu  Phát triển bởi Microsoft  Xuất hiện năm 2000  Phiên bản mới nhất là C# 7.0  Là ngôn ngữ lập trình cấp cao, hiện đại, hướng đối tượng và an toàn kiểu (type-safe)  Có nguồn gốc từ C Cú pháp có phần quen thuộc với C, C++, Java, …  Tập tin mã nguồn có đuôi mở rộng là .cs  Sử dụng Visual Studio để lập trình Hello world using System; class Hello { static void Main() { Console.cs } } Bắt đầu với C#  Biên dịch  Chạy gỡ rối (Debug) và chạy không gỡ rối (Run without debug)  Chế độ Release/Debug  Chạy gỡ rối ▪Breakpoint ▪Step In / Step out / Step over ▪Watch / Auto watch / Local watch Cấu trúc lập trình  Chương trình (Program)  Tên miền (namespace)  Kiểu dữ liệu (type)  Thành viên (member)  Hợp ngữ (assembly) Kiểu dữ liệu Kiểu Kiểu tham chiếu giá trị Các kiểu dữ liệu số Signed Integral ▪sbyte: 8 bits, range from -128 to 127 ▪short: 16 bits, range from -32,768 to 32,767 ▪int : 32 bits, range from -2,147,483,648 to 2,147,483,647 ▪long : 64 bits, range from – 9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Các kiểu dữ liệu số Unsigned integral ▪byte : 8 bits, range from 0 to 255 ▪ushort : 16 bits, range from 0 to 65,535 ▪uint : 32 bits, range from 0 to 4,294,967,295 ▪ulong : 64 bits, range from 0 to 18,446,744,073,709,551,615 Các kiểu dữ liệu số Floating point ▪float : 32 bits, range from 1.4 × 1038, 7-digit precision ▪double : 64 bits, range from 5.7 × 10308, 15-digit precision Decimal ▪decimal : 128 bits, range is at least –7.9 × 1028, with at least 28-digit precision Biến dữ liệu int i; // Simple variable // Many variables can have the same type declaration float x, y, z; byte x = 1, y, z = 3; string name = "new name"; // Array: Indexed by an integer from Zero int x[] = {1, 2, 3}; // compile error int[] x = {1, 2, 3}; char[] y = new char[6]; // OK int x1 = x[0]; // 1 // Multi dimension array: same size in all item int [,] x = {{1, 2}, {3, 4}}; int [,] x = {{1, 2}, {3, 4, 5}}; // compile error int x2 = x[1, 0]; // 3 int [,,] x = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}; Ép kiểu số // Smaller type in memory size integral // type to wider one byte b = 5; // implicit int to byte int i = b; // i = 5 // Wider integral type to smaller one int i = 500; byte j = i; // compile error byte j = (byte)i; // i = 244 // No explicit conversion for floating // point number Boxing / Unboxing  Boxing: chuyển kiểu giá trị  object  Unboxing: trích xuất kiểu giá trị từ object Toán tử  References:. () [] new ->  Arithmetic: + ++ - -- * / % sizeof  Logical: & | ^ !  Conditional: && (&) || ! == != > >= < <=  Type verification: is as typeof  Bitwise: ~ >> <<  Assignment: = += -= *= /= %= &= |= ^= >>= <<=  Selection: ?: ?? (not null)  Lambda expression definition: => Toán tử int i = 5; // Selection ?: string x = i == 5 ? "Yes": "No"; int? x = 5; // nullable type int y = x ?? 0; // Selection ?? operator int z = x; // Error: nullable type // cannot assign to non-nullable type // Lambda expression – anonymous method (int x) => x * 2; <=> public int Double(int x){return x * 2} Cấu trúc điều khiển  Branching ▪Selection: ?: ?? ▪ if… else if … else ▪ switch … case … default  Iteration ▪ for ▪ foreach ▪ do while ▪ while  Ignore & breaking ▪ continue ▪ break Chuỗi literal // Declaration and initialization // "\" start an "escape" code string s1 = "a\n", s2 = "\"", s3 = @"a\n", s4 = s3; // assignment s2 = s1; // concatenation s3 = s1 + s3; Escape code \a Bell (alert) \' Single quotation mark \b Backspace \" Double quotation mark \f Formfeed \\ Backslash \n New line \? Literal question mark \r Carriage return \ooo ASCII character in octal notation \t Horizontal tab \x hh ASCII character in hexadecimal notation \v Vertical tab \x hhhh Unicode in herxadeximal Định dạng chuỗi – String format string header = String.Format( "{0,-12}{1,8}{2,12}{1,8}{2,12}{3,14}\n", // pattern string "City", "Year", "Population", "Change (%)"); // argument list string body = String.Format( "{0,-12}{1,8:yyyy}{2,12:N0}{3,8:yyyy}{4,12:N0}{5,14:P1}", Name, BaseYear, BasePopulation, ObserveYear, ObservePopulation, ObservePopulation – BasePopulation)/ (double) BasePopulation); // Sample output City Year Population Year Population Change (%) ------------------------------------------------------------------ Los Angeles 1940 1,504,277 1950 1,970,358 31.9 % string s = $"{x} - {y}"; Kết chuỗi  Sử dụng “+”  Sử dụng StringBuilder ▪ https://docs.com/en-us/dotnet/standard/base- types/stringbuilder  Câu hỏi: nên kết bằng dấu “+” hay StringBuilder? Tách chuỗi  Phương thức String.Split Tìm kiếm chuỗi  Sử dụng phương thức String.LastIndexOf Mảng ký tự Bài tập chuỗi 1. Read a string and give statistics about the number of occurrence for each of the word in the string. Normalize a string of full name and print out on the screen: no more than one spaces between words, the first letter is capitalized meanwhile the rest are in lower case, no space in the beginning and the end of the string.

Split String fullpath = “C:\Documents\Photos\Test.jpg” into a) Containing directory b) File name c) Extension DateTime using System; … DateTime a = new DateTime(); // Construction complete with year, month, day, // hour, minute, second, millisecond DateTime b = new DateTime(2013, 06, 15, 15, 28, 31, 927); // Current time DateTime c = DateTime.Now; Chuyển String thành DataTime string dateTime = "01/08/2008 14:50:50.42"; DateTime dt = Convert.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}", dt.Millisecond); Chuyển String thành DataTime // Specify exactly how to interpret the string. IFormatProvider culture = new System.CultureInfo("fr-FR", true); // Alternate choice: If the string has been input by an end user, you might want to format it according to the current culture: // IFormatProvider culture = System.CurrentCultur e; DateTime dt2 = DateTime.Parse(dateTime, culture, System.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}", dt2.Millisecond Lớp đối tượng (Class) và Cấu trúc (Struct)  Đều giúp đóng gói dữ liệu (data) + hành vi (behavior)  Lớp đối tượng (Class)  kiểu tham chiếu  Cấu trúc (Struct)  kiểu giá trị  Nhìn ở góc độ Lập trình hướng đối tượng ▪Class  biểu diễn đối tượng phức tạp ▪Struct  biểu diễn dữ liệu phức tạp Ví dụ về Class và Struct Thành phần của class/struct Field Event Constant Finalizer Property Indexer Method Operator Constructor Nested Type Các tính chất của class/struct Accessbility Inheritance - Polymorphism(class) Abstract class Interface Generic Type Static Type Partial Type Đọc thêm về Class và Struct  https://docs.com/en- us/dotnet/csharp/programming-guide/classes-and- structs/  https://www.com/csharp/csharp_classes.ht m Khai báo và định nghĩa Phương thức // undefined parameter number public void Multiply(params int[] list){} Multiply(); // OK Multiply(1); // OK too Multiply(1, 2, 3, 3, 4); // still OK Multiply(new int[] {1, 2, 3, 3, 4}); // error // predefined parameter number public void Multiply(int[] list){} Multiply(); // Error Multiply(1); // Error too Multiply(new int[] {1, 2, 3, 3, 4}); // OK Tham số đầu vào/đầu ra của phương thức public void Add(int a, int b, int c){ c = a + b; } public void AnotherAdd(int a, int b, out int c){ c = a + b; } … int a = 1, b = 2, c = 5; Add(a, b, c); int x = c; // x = 5 AnotherAdd(a, b, out c); x = c; // x = 3 Mảng (Array) int[] a = new int[3]; a[0] = 0; a[1] = 1; a[2] = 2; int[] primes = new int[] { 2, 3, 5, 7 }; int[] squares = { 4, 9, 16, 25 }; string[] extensions = { "jpg", "png", "bmp" }; Mảng nhiều chiều (multi-dimensional array) // Two-dimensional array. int[,] array2D = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // The same array with dimensions specified. int[,] array2Da = new int[4, 2] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; // A similar array with string elements.Write("{0} ", i); } // Output: 9 99 3 33 5 55 Đọc thêm  http://csharp.com/  Làm các bài tập trên www.org Basic coding convention if for do while Trước và sau có một khoảng trắng Luôn có cặp ngoặc cho dù chỉ có 1 dòng lệnh Ngoặc ở dòng kế / trên cùng dòng (java / php / js) Sau if luôn có else

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ