Chuyên đề Lập trình ứng dụng sử dụng C#.net

Tài liệu Chuyên đề Lập trình ứng dụng sử dụng C#.net: 1Môn học CHUYÊN ĐỀ: Lập trình ứng dụng sử dụng C#.NET (tài liệu lưu hành nội bộ) GV: Phạm Văn Thuận Bộ môn Kỹ thuật Máy tính Khoa CNTT- ĐH BKHN email: thuanpv@it-hut.edu.vn 2Lập trình C#.NET Mục tiêu môn học § Sau khi kết thúc môn học này, sinh viên có thể • Trình bày được đặc trưng cơ bản của công nghệ .NET • Trình bày được kỹ thuật lập trình hướng đối tượng sử dụng ngôn ngữ C#.NET • Lập trình được một ứng dụng Windows Form sử dụng ngôn ngữ C#.NET, kết nối với cơ sở dữ liệu SQL Server, lập báo cáo sử dụng công cụ Crystal Report. 3Lập trình C#.NET § Tài liệu tham khảo chính: • Programming C#, 4th Edition, Jesse Liberty • Pro .NET 2.0 Windows Forms and Custom Controls in C#, Matthew MacDonald • Professional C#, 2nd Edition, Wrox Press Ltd (Bản dịch tiếng Việt) • ftp://dce.hut.edu.vn/thuanpv/C_Sharp 4Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chư...

pdf214 trang | Chia sẻ: Khủng Long | Lượt xem: 1243 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Chuyên đề Lập trình ứng dụng sử dụng C#.net, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
1Môn học CHUYÊN ĐỀ: Lập trình ứng dụng sử dụng C#.NET (tài liệu lưu hành nội bộ) GV: Phạm Văn Thuận Bộ môn Kỹ thuật Máy tính Khoa CNTT- ĐH BKHN email: thuanpv@it-hut.edu.vn 2Lập trình C#.NET Mục tiêu môn học § Sau khi kết thúc môn học này, sinh viên có thể • Trình bày được đặc trưng cơ bản của công nghệ .NET • Trình bày được kỹ thuật lập trình hướng đối tượng sử dụng ngôn ngữ C#.NET • Lập trình được một ứng dụng Windows Form sử dụng ngôn ngữ C#.NET, kết nối với cơ sở dữ liệu SQL Server, lập báo cáo sử dụng công cụ Crystal Report. 3Lập trình C#.NET § Tài liệu tham khảo chính: • Programming C#, 4th Edition, Jesse Liberty • Pro .NET 2.0 Windows Forms and Custom Controls in C#, Matthew MacDonald • Professional C#, 2nd Edition, Wrox Press Ltd (Bản dịch tiếng Việt) • ftp://dce.hut.edu.vn/thuanpv/C_Sharp 4Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 5Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 6Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 7Lập trình C#.NET Nội dung chương 1 1.1. Nền tảng .NET (.NET Flatform) 1.2. Kiến trúc .NET (.NET Framework) 1.3. Biên dịch trong .NET 1.4. Ngôn ngữ lập trình C# 8Lập trình C#.NET 1.1. Nền tảng .NET (.NET Flatform) .NET Platform là nền tảng phát triển: - Cung cấp giao diện lập trình (API) cho các dịch vụ (services) và các hàm API truyền thống của hệ điều hành Windows - Cung cấp một nền tảng phát triển chung cho nhiều ngôn ngữ lập trình khác nhau của Microsoft: C#, Visual J#, Visual Basic 9Lập trình C#.NET Nền tảng .NET (.NET Flatform) .NET Platform bao gồm các nhóm sản phẩm • Tập hợp các ngôn ngữ (C#, VB), một tập hợp các công cụ phát triển bao gồm Visual Studio .NET, thư viện để phát triển các ứng dụng web (web and web services), các ứng dụng Windows cũng như môi trường thực thi chung (Common Language Runtime (CLR)) • Nền tảng .NET 2.0 không chỉ hỗ trợ các ứng dụng trên máy tính cá nhân, máy chủ mà còn hỗ trợ các thiết bị nhúng (Cell phones, game boxes) 10 Lập trình C#.NET 1.2. Kiến trúc .NET (.NET Framework) § Microsoft .NET hỗ trợ nhiều ngôn ngữ khác nhau nhờ hệ thống - Common Type System (CTS) § Quy định những yêu cầu tối thiểu để một ngôn ngữ lập trình có thể tích hợp vào .NET – Common Language Specification (CLS) § Kiến trúc .NET là tầng ngay trên hệ điều hành, bao gồm: • 5 ngôn ngữ lập trình chính thức: C#, VB, VC++, Visual J# và Jscript.NET • CLR (Common Language Runtime) • Các thư viện lập trình 11 Lập trình C#.NET .NET Framework 12 Lập trình C#.NET 1.3. Biên dịch trong .NET § .NET không biên dịch trực tiếp các chương trình thành file thực thi. § .NET biên dịch các chương trình thành các assembly, chứa các mã chương trình trung gian của Microsoft (Microsoft Intermediate Language - MSIL) § CLR sẽ dịch một lần nữa, sử dụng chương trình biên dịch Just In Time (JIT) chuyển các mã MSIL sang mã máy và thực thi 13 Lập trình C#.NET Biên dịch trong .NET 14 Lập trình C#.NET 1.4. Ngôn ngữ lập trình C# § C# được phát triển bởi nhóm tác giả điều hành bởi Anders Hejlsberg và Scott Wiltamuth, tác giả của Turbo Pascal và Borland Delphi. § C# là ngôn ngữ lập trình hướng đối tượng (Object Oriented Language) • Hỗ trợ định nghĩa và làm việc với lớp (class) • Hỗ trợ đầy đủ ba cơ chế đặc trưng của lập trình hướng đối tượng: đóng gói (encapsulation), kế thừa (inheritance) và đa hình (polymorphism) 15 Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 16 Lập trình C#.NET Nội dung chương 2 2.1. Môi trường phát triển ứng dụng .NET 2.2. Chương trình Hello World 2.3. Môi trường phát triển ứng dụng Visual Studio .NET 17 Lập trình C#.NET 2.1. Môi trường phát triển ứng dụng .NET § Môi trường thực thi ứng dụng .NET: Microsoft .NET Framework • § Trình soạn thảo và biên dịch - Visual Studio .NET IDE - Trình soạn thảo văn bản (Notepad, UltraEdit) & Trình biên dịch bằng dòng lệnh (Command-line compiler) 18 Lập trình C#.NET 2.2. Chương trình Hello World 1) Mở chương trình Visual Studio .NET 2005 2) Tạo một dự án mới với kiểu ứng dụng console(HelloWorld) 19 Lập trình C#.NET Chương trình Hello World §Chương trình sẽ tự tạo một khung dự án §Thêm dòng code đơn giản hiển thị thông báo helloworld ra màn hình §Bấm F6 để biên dịch, F5 để chạy 20 Lập trình C#.NET Chương trình Hello World Kết quả khi chạy chương trình Hello World 21 Lập trình C#.NET Một số khái niệm cơ bản trong C# § Chú thích • Chú thích trên một dòng dùng // • Chú thích trên nhiều dòng dùng /* */ • Trình biên dịch bỏ qua chú thích • Chỉ dùng cho người đọc § Namespaces (Không gian tên) • Nhóm các tính năng có liên quan của C# vào một loại • Cho phép dễ dàng tái sử dụng mã • Trong thư viện .NET framework có nhiều không gian tên • Phải tham chiếu tới để sử dụng 22 Lập trình C#.NET Một số khái niệm cơ bản trong C# § Kí tự cách trắng (White Space) • Chứa các khoảng trống, ký tự xuống dòng và tabs § Từ khoá (Keywords) • Các từ không được dùng làm tên biến,tên lớp hay bất kỳ thứ gì khác • Có các chức năng đặc biệt không thể thay đổi trong ngôn ngữ • Ví dụ : class • Tất cả các từ khoá đều được viết thường 23 Lập trình C#.NET Một số khái niệm cơ bản trong C# § Lớp (class): định nghĩa một kiểu dữ liệu, mô tả một nhóm các đối tượng với các phương thức và thuộc tính • Phương thức (Method) • Thuộc tính (Property) 24 Lập trình C#.NET Chương trình Hello World using System; using System.Collections.Generic; using System.Text; namespace HelloWorld { class Program { static void Main(string[] args) { Console.WriteLine("Hello World"); } } } Using statement Namespace Class Static function Code statement 25 Lập trình C#.NET 2.3. Visual Studio .NET IDE 2005 Giao diện làm việc chính 26 Lập trình C#.NET Gỡ lỗi sử dụng VS.NET 2005 Set breakpoint -Nhấn F9 hoặc -Click chuột trái vào bên lề trái của hàng cần đặt breakpoint 27 Lập trình C#.NET Gỡ lỗi sử dụng VS.NET 2005 Bắt đầu quá trình debug: nhấn F5 (Debug -> Start Debugging” 28 Lập trình C#.NET Gỡ lỗi sử dụng VS.NET 2005 Xem giá trị của các biến, đối tượng Xem giá trị các biến, đối tượng tại cửa sổ local 29 Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 30 Lập trình C#.NET Nội dung chương 3 3.1. Kiểu dữ liệu (Types) 3.2. Biến và hằng số (Variables and Constants) 3.3. Các câu lệnh và cấu trúc điều khiển (Statements) 3.4. Các toán tử (Operators) 31 Lập trình C#.NET 3.1. Kiểu dữ liệu (Types) § C# là ngôn ngữ định kiểu mạnh: • Phải định nghĩa kiểu dữ liệu của mỗi đối tượng (Ví dụ: integers, floats, strings, buttons) • Trình biên dịch sẽ kiểm tra và đảm bảo ngăn chặn các lỗi do các phép gán sai kiểu dữ liệu § Phân loại dữ liệu § Phân theo phương thức định nghĩa: build-in (có sẵn) và user-defined (người dùng tự định nghĩa) § Phân theo cách thức lưu trữ: value (tham trị) và reference (tham chiếu) 32 Lập trình C#.NET Kiểu dữ liệu (Types) § Kiểu tham trị (value type) • Lưu trữ trong vùng nhớ ngăn xếp (stack) § Kiểu tham chiếu (reference type) • Địa chỉ lưu trữ trong ngăn xếp (stack) • Dữ liệu thực được lưu trữ trong vùng nhớ Heap Cho phép lưu trữ đối tượng có kích thước lớn 33 Lập trình C#.NET Kiểu dữ liệu có sẵn (build-in type) § C# hỗ trợ một số kiểu dữ liệu có sẵn, mỗi kiểu dữ liệu này tương ứng với một kiểu dữ liệu hỗ trợ bởi .NET CLS (Common Language System). § C# có thể sử dụng đối tượng do các ngôn ngữ khác trong bộ .NET tạo ra và ngược lại (Ví dụ: VB.NET) § Mỗi kiểu dữ liệu có kích thước xác định 34 Lập trình C#.NET Kiểu dữ liệu có sẵn (build-in type) 35 Lập trình C#.NET Kiểu dữ liệu có sẵn (build-in type) 36 Lập trình C#.NET Escape Character 37 Lập trình C#.NET Chuyển đổi kiểu dữ liệu § Có hai cách chuyển đổi kiểu dữ liệu có sẵn • Chuyển đổi ngầm (implicity): quá trình chuyển đổi diễn ra tự động và đảm bảo không bị mất mát dữ liệu üVí dụ: short x=5; int y=x; • Chuyển đổi tường minh (explicity) sử dụng toán tử chuyển đổi (cast operator) üVí dụ: (char)65 -> chuyển đổi từ số sang ký tự 38 Lập trình C#.NET 3.2. Biến và hằng số (Variables and Constants) § Biến (variable): • Một vùng nhớ có định kiểu • Có thể gán và thay đổi được giá trị • Các biến phải được khởi gán trước khi sử dụng, nếu không, trình biên dịch sẽ báo lỗi int myInt; System.Console.WriteLine ("Uninitialized, myInt: {0}", myInt); 39 Lập trình C#.NET Hằng số § Hằng số (Constant) • Là biến số nhưng không thể thay đổi giá trị sau khi khởi gán. const int myConst=32; myConst = 30; 40 Lập trình C#.NET Kiểu liệt kê § Kiểu liệt kê chứa một tập hợp các hằng số (enumerator list). Lợi ích của enumerator • Cho phép nhóm một tập hợp các hằng số có liên quan với nhau -> tránh phải khai báo nhiều hằng số và tăng mối quan hệ logic giữa các hằng số • Làm đơn giản hóa mã chương trình enum GoodWeather : uint { temperature=28, moisture=80, wind=5 } 41 Lập trình C#.NET Chuỗi (string) và cách đặt tên trong C# § Chuỗi là một mảng các ký tự § Khai báo và khởi gán giá trị cho chuỗi • string myString=“Test String”; § Trong C#, chúng ta nên đặt tên các biến, các phương thức, các lớptheo khuyến cáo của Microsoft • Tên biến: bắt đầu bằng chữ thường (VD: someName) • Tên phương thức và các thành phần khác: bắt đầu bằng chữ hoa (VD: SomeOtherMethod) 42 Lập trình C#.NET 3.3. Các câu lệnh (statements) § Một chương trình C# là một dãy các câu lệnh (statements) § Mỗi câu lệnh kết thúc bởi dấu “;” § Các câu lệnh được xử lý tuần tự theo chiều từ trên xuống dưới (trừ các câu lệnh điều khiển: lệnh nhảy, lệnh lặp) int x; // a statement x = 23; // another statement int y = x; // yet another statement 43 Lập trình C#.NET Lệnh nhảy không điều kiện § Có hai trường hợp phát sinh lệnh nhảy không điều kiện: • Có lời gọi một phương thức: dừng phương thức hiện tại và chuyển sang (nhảy không điều kiện) thực hiện phương thức vừa triệu gọi, sau khi thực hiện xong, trở về phương thức trước đó. • Sử dụng một trong số các lệnh nhảy không điều kiện: goto, break, continue, return hoặc throw 44 Lập trình C#.NET Lệnh nhảy có điều kiện § Câu lệnh: ifelse § Câu lệnh điều kiện lồng (Nested if) § Câu lệnh chọn: switchcase 45 Lập trình C#.NET Câu lệnh điều kiện ifelse if (Biểu thức điều kiện) Công việc 1 [else Công việc 2] int valueOne = 10; int valueTwo = 15; if(valueOne>=valueTwo) { Console.WriteLine("Max= {0}",valueOne); } else { Console.WriteLine("Max= {0}",valueTwo); } 46 Lập trình C#.NET Câu lệnh điều kiện lồng (Nested if) § Có thể được sử dụng trong những câu lệnh điều kiện phức tạp, điều kiện lồng nhau. char charTest = 'z'; if (charTest < 'A') { Console.WriteLine("Khong phai chu cai hoa"); } else { if (charTest > 'Z') { Console.WriteLine("Khong phai chu cai hoa"); } else { Console.WriteLine("La chu cai hoa"); } } 47 Lập trình C#.NET Câu lệnh chọn: switchcase switch (biểu thức cần kiểm tra) { case trường_hợp: Các câu lệnh Lệnh nhảy (break, continue) [default: Các câu lệnh cho trường hợp mặc định] } 48 Lập trình C#.NET Câu lệnh chọn: switchcase static void Main(string[] args) { const int Vietnam = 0; const int Laos = 1; const int Cambodia = 2; const int Thailand = 3; int country=Thailand; switch (country) { case Vietnam: Console.WriteLine("The Capital is Hanoi"); break; case Laos: Console.WriteLine("The Capital is Vientiane"); break; case Cambodia: Console.WriteLine("The Capital is Phnompenh"); break; default: Console.WriteLine("This country isn't belong to The Indochinese Peninsula"); break; } 49 Lập trình C#.NET Câu lệnh chọn: switchcase static void Main(string[] args) { string country="Vietnam"; switch (country) { case "Vietnam": Console.WriteLine("The Capital is Hanoi"); break; case "Laos": Console.WriteLine("The Capital is Vientiane"); break; case "Cambodia": Console.WriteLine("The Capital is Phnompenh"); break; default: Console.WriteLine("This country isn't belong to The Indochinese Peninsula"); break; } 50 Lập trình C#.NET Các lệnh lặp § Vòng lặp for § Vòng lặp while § Vòng lặp dowhile § Vòng lặp foreach : sử dụng để lặp qua các phần tử của một mảng hay một tập hợp 51 Lập trình C#.NET Vòng lặp for for ( [initializers]; [expression]; [iterators]) statement Khởi tạo Biểu thức kiểm tra Lệnh lặp Công việc cần thực thi for (int i=0; i<10; i++) Console.WriteLine(“Current value = {0}”,i); 52 Lập trình C#.NET Vòng lặp for (Ví dụ) static void Main(string[] args) { for (int i = 0; i < 25; i++) { if (i % 5 == 0) { Console.Write("\n"); Console.Write("\t{0}", i); } else { Console.Write("\t{0}", i); } } } 53 Lập trình C#.NET Vòng lặp while while (expression) statement Biều thức kiểm tra Công việc cần thực thi static void Main(string[ ] args) { int iTest=0 ; while(iTest<10) { Console.Write("{0}",iTest); iTest++; } } 54 Lập trình C#.NET Vòng lặp dowhile do statement while expression Biều thức kiểm traCông việc cần thực thi static void Main(string[ ] args) { int i = 11; do { Console.WriteLine("i: {0}", i); i++; } while (i < 10); } 55 Lập trình C#.NET 3.4. Toán tử (Operator) § Toán tử được phân thành nhiều liệu khác nhau • Toán tử gán (assignment operator): = • Toán tử toán học (arithmetic operators): +, -, * • Toán tử tăng, giảm (increment and decrement operators): ++, --, -=, *= • Toán tử quan hệ (relational operators): ==, != • Toán tử logic (logical operators): &&, || • Toán tử ba thành phần (Ternary Operator) 56 Lập trình C#.NET Toán tử toán học § Các toán tử cơ bản: cộng (+), trừ (-), nhân (*), chia (/) § Toán tử chia lấy phần dư (modulus): % static void Main(string[] args) { int i1 = 17; int i2 = 4; Console.WriteLine("Integer:{0} \nFloat:{1} \nModulus:{2}", i1 / i2, (float)i1 / i2, i1 % i2); } 57 Lập trình C#.NET Toán tử tăng, giảm myInt=myInt+10 myInt=myInt-10 myInt=myInt*10 myInt=myInt/10 myInt+=10 myInt-=10 myInt*=10 myInt/=10 Postfix: myInt++ myInt-- Prefix : ++myInt --myInt Gán trước, biến đổi sau VD: myInt=1; newInt=myInt++; Biến đổi trước, gán sau VD: myInt=1; newInt=++myInt newInt=1 newInt=2 58 Lập trình C#.NET Toán tử quan hệ So sánh nhỏ hơn hoặc bằng<= So sánh nhỏ hơn< So sánh lớn hơn hoặc bằng>= So sánh lớn hơn> So sánh khác nhau!= So sánh bằng== TênToán tử 59 Lập trình C#.NET Toán tử logic Toán tử “phủ định” logic !(x==3) -> true ! Toán tử “hoặc” logic (x==3) || (y==7) -> true || Toán tử “và” logic (x==3) && (y==7) -> false && Chức năngToán tử Chú thích: dữ liệu kiểm tra, x=5 và y=7 60 Lập trình C#.NET Toán tử ba thành phần conditional-expression ? expression1 : expression2 § Conditional-expression: biểu thức kiểm tra điều kiện § Expression1: biểu thức 1, thực hiện khi biểu thức kiểm tra trả về true § Expression2: biểu thức 2, thực hiện khi biểu thức kiểm tra trả về false § Ví dụ: int valueOne = 10; int valueTwo = 20; int maxValue = valueOne > valueTwo ? valueOne : valueTwo; 61 Lập trình C#.NET Bài thực hành số 1 62 Lập trình C#.NET Bài thực hành số 1 Bài 1: Viết một chương trình cho phép người dùng nhập tên của họ, sau đó in lại tên đó dưới dạng một lời chào Bài 2: Viết một chương trình gọi một phương thức tính bình phương của một số 63 Lập trình C#.NET Bài thực hành số 1 Bài 3: Viết đoạn chương trình đọc vào một số nguyên dương và kiểm tra số đó là chẵn hay lẻ Bài 4: Viết đoạn chương trình hiển thị bảng cửu chương của số bất kỳ (từ 1 đến 9) 64 Lập trình C#.NET Bài thực hành số 1 Bài 5: Viết chương trình hiển thị một tam giác vuông cân tạo thành từ các ký tự bất kỳ, có độ dài cạnh nhập từ bàn phím 65 Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 66 Lập trình C#.NET Nội dung chương 4 4.1. Cơ bản về lập trình hướng đối tượng 4.2. Lớp và đối tượng (Class and Object) 4.3. Kỹ thuật kế thừa và đa hình (Inheritance and Polymorphism) 4.4. Kỹ thuật chồng toán tử (Operator Overloading) 4.5. Cấu trúc struct 4.6. Interfaces 4.7. Mảng, chỉ số và tập hợp (Arrays, Indexers) 4.8. Xử lý chuỗi 4.9. Bắt ngoại lệ (Handling Exception) 4.10. Delegates và Events 67 Lập trình C#.NET 4.1. Cơ bản về lập trình hướng đối tượng Loài cá vàng Class • Quy các thành phần của hệ thống về các đối tượng • Một đối tượng là một thể hiện của một lớp (class) Con cá vàng 1 Con cá vàng 2 Con cá vàng 3 Object 68 Lập trình C#.NET Thuộc tính và phương thức Lớp và các đối tượng thuộc lớp đó có chung các thuộc tính (properties) và phương thức (methods) • Thuộc tính (Property): kích thước, màu, giới tính • Phương thức (Method): bơi, thở, ăn 69 Lập trình C#.NET Kế thừa (Inheritance) 70 Lập trình C#.NET Các quan hệ (relationships) Các đối tượng không tồn tại một cách độc lập, luôn tồn tại mối quan hệ giữa nó và các đối tượng khác: tổng quát hóa (generalization) , cộng tác (asscociation) § Các đồ vật nằm trong phòng § Lọ hoa ở trên bàn § Bàn và ghế thuộc nhóm đồ nội thất 71 Lập trình C#.NET Tổng quát hóa (generalization) § Lớp cha (fish) tổng quát hóa các thuộc tính, phương thức chung của các lớp con (Goldfish và Shark). § Các lớp con cũng có những thuộc tính, phương thức riêng. 72 Lập trình C#.NET Quan hệ cộng tác (Association) § Các lớp có liên kết (connected) hoặc liên quan (related) với nhau Cd player + Speaker (Collaboration) Shark eat fish 73 Lập trình C#.NET Quan hệ kết tập (Aggregation) Thể hiện mối quan hệ giữa tổng thể (the whole) và bộ phận (parts) • Tổng thể: đàn cá vàng • Bộ phận: từng con cá vàng 74 Lập trình C#.NET Quan hệ cấu thành (Composition) § Là một dạng của quan hệ kết tập, tuy nhiên yêu cầu chặt chẽ hơn • Mỗi bộ phận (part) chỉ nằm trong một cái tổng thể (the whole) duy nhất üVD: phòng ngủ nhà bạn phải nằm trong nhà bạn, không thể nằm trong nhà hàng xóm hay bất cứ ngôi nhà nào khác 75 Lập trình C#.NET Quan hệ cấu thành (Composition) § Khi phá hủy cái tổng thể thì đồng thời cái bộ phận cũng bị phá hủy Phá nhà Phá phòng ngủ 76 Lập trình C#.NET Quan hệ (relationship) § Số lượng đối tượng tham gia vào quan hệ • Quan hệ 1 – 1 üMột lớp học trong một phòng học • Quan hệ 1 – nhiều üMột giáo viên có thể dạy nhiều lớp • Quan hệ nhiều – nhiều üMột giáo viên dạy nhiều sinh viên üMột sinh viên học nhiều giáo viên 77 Lập trình C#.NET Tính đa hình (Polymorphism) § Đa hình: là khả năng có thể thực hiện cùng một hành động (phương thức) với nhiều cách thức khác nhau không phụ thuộc vào đối tượng cụ thể thuộc về lớp nào 78 Lập trình C#.NET 4.2. Lớp và đối tượng §Định nghĩa lớp (class) [attributes] [access-modifiers] class identifier [:base-class [,interface(s)]] {class-body} Access-modifiers : quyết định phạm vi truy cập tới các thuộc tính và phương thức của lớp Identifier : tên lớp Base-class : lớp cơ sở (lớp cha) Class-body : định nghĩa các thuộc tính và phương thức của lớp 79 Lập trình C#.NET Access-modifiers Có thể được truy xuất bởi các phương thức của lớp đó, lớp dẫn xuất từ lớp đó và các lớp trong cùng Assembly với nó internal protected Có thể được truy xuất bởi các phương thức của các lớp trong cùng Assembly internal Có thể được truy xuất bởi các phương thức của chính lớp đó và các lớp dẫn xuất (derived) từ nó protected Chỉ có thể truy xuất bởi các phương thức của chính lớp đó private Không giới hạn. Các thành phần public có thể được truy xuất bởi bất cứ phương thức của bất kỳ lớp nào khác public Giới hạn truy nhậpAccess-modifier 80 Lập trình C#.NET Ví dụ định nghĩa lớp public class Time { // Các thuộc tính private int Year; int Month; int Date; int Hour; int Minute; int Second; // Các phương thức public public void DisplayCurrentTime() { Console.WriteLine("Ngay, gio hien tai"); } } Khai báo lớp Các thuộc tính (phương thức truy cập mặc định là private) Phương thức của lớp 81 Lập trình C#.NET Khai báo và sử dụng đối tượng của lớp public class Tester { static void Main() { Time t = new Time(); t.DisplayCurrentTime(); } } 82 Lập trình C#.NET Tạo đối tượng (create object) § Sử dụng từ khóa “new” Class_name Object_name = new Class_name( ); Ví dụ: Time t=new Time( ); § Đối tượng là biến kiểu tham chiếu, không phải tham trị. • Biến t không chứa giá trị của đối tượng • Biến t chứa địa chỉ của đối tượng được tạo trong bộ nhớ Heap 83 Lập trình C#.NET Hàm tạo (constructor) § Khởi tạo một đối tượng -> gọi hàm tạo (constructor) • Hàm tạo mặc định: sẽ được CLR cung cấp nếu người lập trình không định nghĩa • Hàm tạo do người lập trình định nghĩa § Hàm tạo có chức năng: • Tạo một đối tượng của lớp và chuyển nó sang trạng thái xác định (valid state) • Hàm tạo thường được dùng để khởi gán các thuộc tính của đối tượng 84 Lập trình C#.NET Hàm tạo mặc định (default constructor) § Hàm tạo mặc định tạo đối tượng của lớp, ngoài ra không làm gì khác § Các thuộc tính được khởi gán các giá trị mặc định nullreference 0enum ‘\0’ (null)char falsebool 0numeric (int, long, ) Giá trị mặc địnhKiểu dữ liệu 85 Lập trình C#.NET Xây dựng hàm tạo § Hàm tạo có tên hàm trùng tên đối tượng, không có kiểu dữ liệu trả về và phạm vi truy nhập thường là public. § Hàm tạo có thể có tham số hoặc không public Class_name() public Class_name( argument list ) § Ví dụ: public Time() public Time(System.Datetime t) 86 Lập trình C#.NET Xây dựng hàm tạo public class Time { // private variables int Year; int Month; int Date; int Hour; int Minute; int Second; // contructor public Time(System.DateTime d) { Year = d.Year; Month = d.Month; Date = d.Day; Hour = d.Hour; Minute = d.Minute; Second = d.Second; } // public methods public void DisplayCurrentTime() { System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", Date, Month, Year, Hour, Minute, Second); } } 87 Lập trình C#.NET Kiểm tra hàm tạo public class Tester { static void Main() { System.DateTime currentDate = System.DateTime.Now; Time t = new Time(currentDate); t.DisplayCurrentTime(); } } 88 Lập trình C#.NET Hàm tạo sao chép (copy constructor) § Để hỗ trợ chức năng hàm tạo sao chép.NET định nghĩa một interface ICloneable § Class hỗ trợ hàm tạo sao chép phải • implement interface ICloneable public Object Clone() { return MemberwiseClone(); // shallow copy } • Tự xây dựng hàm tạo sao chép (hand-copying copy constructor) 89 Lập trình C#.NET Tự xây dựng hàm tạo //hand-copying contructor public Time(Time previousTime) { Year = previousTime.Year; Month = previousTime.Month; Date = previousTime.Date; Hour = previousTime.Hour; Minute = previousTime.Minute; Second = previousTime.Second; } 90 Lập trình C#.NET Gọi hàm tạo sao chép public class Tester { static void Main() { System.DateTime currentDate = System.DateTime.Now; Time t = new Time(currentDate); Time t2 = (Time)t.Clone(); t2.DisplayCurrentTime(); Time t3 = new Time(t2); t3.DisplayCurrentTime(); } } 91 Lập trình C#.NET Từ khóa this § Từ khóa this trỏ đến thể hiện hiện tại (current instance) của đối tượng § Từ khóa this rất hữu ích trong một số trường hợp 1) Chỉ rõ thành phần (thuộc tính) của đối tượng, tránh nhầm lẫn với tên biến, tránh sự nhập nhằng về tên public void SomeMethod (int hour) { this.hour = hour; } 92 Lập trình C#.NET Từ khóa this (tiếp) 2)Dùng làm tham số truyền vào cho một phương thức của đối tượng khác, cho phép phương thức đó có thể tác động đến các thành phần của đối tượng hiện tại. class myClass { public void Foo(OtherClass otherObject) { otherObject.Bar(this); } } 93 Lập trình C#.NET Từ khóa this (tiếp) 3) Sử dụng cùng với indexer (Tìm hiểu sau) 4) Gọi một hàm tạo từ hàm tạo khác của lớp class myClass { public myClass(int i) { //... } public myClass( ) : this(42) { //... } } 94 Lập trình C#.NET Từ khóa this (tiếp) 5) Gọi tường minh các phương thức, thuộc tính của lớp public void MyMethod(int y) { int x = 0; x = 7; // assign to a local variable y = 8; // assign to a parameter this.z = 5; // assign to a member variable this.Draw( ); // invoke member method } 95 Lập trình C#.NET Sử dụng các thành phần tĩnh (static memebrs) § Thành phần tĩnh là các thành phần chung (thuộc tính, phương thức) của lớp • Truy xuất các thành phần tĩnh thông qua tên lớp Class_name.Static_Member • C# không cho phép truy xuất các thành phần tĩnh thông qua đối tượng (thể hiện của lớp) • Các thành phần tĩnh có thể được truy nhập, triệu gọi trước khi các đối tượng của lớp đó được tạo ra • Các phương thức tĩnh không thể truy xuất trực tiếp các thuộc tính, phương thức không tĩnh (non- static) 96 Lập trình C#.NET Ví dụ sử dụng thành phần tĩnh namespace StaticFields { public class Cat { private static int instances = 0; public Cat() { instances++; } public static void HowManyCats() { Console.WriteLine("{0} cats adopted",instances); } } public class Tester { static void Main() { Cat.HowManyCats(); Cat frisky = new Cat(); Cat.HowManyCats(); Cat whiskers = new Cat(); Cat.HowManyCats(); } } } 97 Lập trình C#.NET Hủy đối tượng (Destroying Object) § C# hỗ trợ cơ chế tự động thu gom rác (garbage collector) -> người lập trình không phải hủy đối tượng một cách tường minh. § Nếu đối tượng có sử dụng các tài nguyên khác (files) -> người lập trình phải tự xây dựng hàm hủy (Destructor) § Bộ thu gom rác tự động gọi hàm hủy, các phương thức không gọi một cách tường minh. 98 Lập trình C#.NET Xây dựng hàm hủy § Về mặt cú pháp, hàm hủy trong C# giống với C++ ~Class_Name( ) ~MyClass() { // do work here } protected override void Finalize() { try { // do work here. } finally { base.Finalize( ); } } 99 Lập trình C#.NET Truyền tham số cho phương thức § Mặc định, tham số truyền cho phương thức là kiểu tham trị • Một bản sao của tham số đó được tạo ra • Bản sao đó sẽ bị hủy khi kết thúc phương thức • Giá trị của tham số được truyền không thay đổi sau khi kết thúc phương thức public int AddValue(int value1, int value2) { return value1+value2; } 100 Lập trình C#.NET Truyền tham chiếu § C# hỗ trợ truyền tham chiếu sử dụng các từ khóa • ref: truyền tham chiếu, biến được tham chiếu phải được khởi gán trước khi truyền • out: truyền tham chiếu, biến được tham chiếu không cần khởi gán trước khi truyền 101 Lập trình C#.NET Truyền tham chiếu sử dụng từ khóa ref public void GetTime( ref int h, ref int m, ref int s ) { h = Hour; m = Minute; s = Second; } System.DateTime currentTime = System.DateTime.Now; Time t = new Time( currentTime ); int theHour = 0; int theMinute = 0; int theSecond = 0; t.GetTime( ref theHour, ref theMinute, ref theSecond ); Định nghĩa phương thức Gọi phương thức 102 Lập trình C#.NET Truyền tham chiếu sử dụng từ khóa out public void GetTime( out int h, out int m, out int s ) { h = Hour; m = Minute; s = Second; } System.DateTime currentTime = System.DateTime.Now; Time t = new Time( currentTime ); int theHour; int theMinute; int theSecond; t.GetTime( out theHour, out theMinute, out theSecond ); Định nghĩa phương thức Gọi phương thức 103 Lập trình C#.NET Overloading methods and constructors § Khi muốn có nhiều hàm cùng tên (VD: nhiều hàm tạo (constructor) hay nhiều phương thức với tham số đầu vào khác nhau) -> sử dụng kỹ thuật chồng hàm (Overloading) § Để phân biệt được hai hàm với nhau, phải căn cứ vào một trong hai yếu tố • Khác tên • Khác số tham số hoặc kiểu dữ liệu của tham số void myMethod(int p1); void myMethod(int p1, int p2); void myMethod(int p1, string s1); 104 Lập trình C#.NET Đóng gói dữ liệu thành các thuộc tính § Đóng gói dữ liệu thành các thuộc tính đem lại hai lợi ích • Vẫn đảm bảo một giao diện đơn giản cho các đối tượng khác giao tiếp. • Dễ dàng thay đổi mã mà không ảnh hưởng tới giao diện với các đối tượng khác. • Tăng tính an toàn dữ liệu, kiểm tra được dữ liệu khi gán 105 Lập trình C#.NET Sử dụng các thuộc tính (property) private int hour; public int Hour { get { return hour; } set { hour = value; } } Lấy về giá trị của thuộc tính Thiết lập giá trị của thuộc tính 106 Lập trình C#.NET Thuộc tính chỉ đọc (readonly) public static readonly int Year; public static readonly int Month; public static readonly int Date; public static readonly int Hour; public static readonly int Minute; public static readonly int Second; -> Chỉ có thể gán giá trị sử dụng hàm tạo tĩnh (static constructor) hoặc khởi gán ngay từ ban đầu. 107 Lập trình C#.NET Bài thực hành số 2 108 Lập trình C#.NET Bài thực hành số 2 109 Lập trình C#.NET Bài thực hành số 2 110 Lập trình C#.NET Bài thực hành số 2 111 Lập trình C#.NET Bài thực hành số 2 112 Lập trình C#.NET 4.3. Kế thừa và đa hình § Tổng quát hóa và cá thể hóa (generalization and specialization) § Kế thừa (inheritance) § Đa hình (polymorphism) § Lớp trừu tượng (abstract class) 113 Lập trình C#.NET Tổng quát hóa và cá thể hóa Cá thể hóa Tổng quát hóa §Tổng quát hóa: các lớp đối tượng có những thuộc tính, phương thức chung được tổng quát thành các lớp cha §Cá thể hóa: các lớp con kế thừa các phương thức, thuộc tính của lớp cha và bổ sung thêm thuộc tính, phương thức của riêng nó 114 Lập trình C#.NET Kế thừa (inheritance) § Kế thừa (inheritance) là kỹ thuật thể hiện quan hệ cá thể hóa (specialization) public class ListBox : Control public class Button : Control 115 Lập trình C#.NET Kế thừa (Inheritance) § Ưu điểm của kỹ thuật kế thừa • Khả năng tái sử dụng mã. VD: lớp ListBox có thể sử dụng một số phương thức, thuộc tính của lớp Control • Khả năng sử dụng kỹ thuật đa hình (Polymorphism). VD: lớp Control có phương thức Draw(), lớp Listbox và Button cũng có phương thức Draw(). 116 Lập trình C#.NET Tạo phương thức hỗ trợ đa hình public virtual void Draw( ) { //Code statements } public override void Draw( ) { //Code statements } 117 Lập trình C#.NET VÍ DỤ Kỹ thuật kế thừa và đa hình 118 Lập trình C#.NET Lớp trừu tượng (abstract class) § Sử dụng lớp trừu tượng khi • Yêu cầu tất cả các lớp con, kế thừa từ nó phải cài đặt một hoặc một vài phương thức nào đó. § Đặc điểm của lớp trừu tượng • Lớp trừu tượng là lớp tồn tại ít nhất một phương thức trừu tượng • Không thể tạo đối tượng của lớp trừu tượng 119 Lập trình C#.NET Khai báo lớp trừu tượng abstract public class Control { protected int top; protected int left; // constructor public Control( int top, int left ) { this.top = top; this.left = left; } abstract public void DrawWindow( ); } Khai báo lớp trừu tượng Khai báo phương thức trừu tượng 120 Lập trình C#.NET Kế thừa lớp trừu tượng public class Button : Control { public Button(int top,int left ):base(top, left) { } // implement the abstract method public override void DrawWindow( ) { Console.WriteLine( "Drawing a button at {0}, {1}\n",top, left ); } } 121 Lập trình C#.NET VÍ DỤ Lớp trừu tượng 122 Lập trình C#.NET Root class: Object § Trong C#, tất cả các lớp, thậm chí các kiểu dữ liệu có sẵn đều dẫn xuất, kế thừa từ lớp Object. Object là lớp cao nhất trong cây kế thừa của C# § Lớp Object cung cấp một số các phương thức ảo mà các lớp con có thể cài đặt và thực thi • Equals() • GetType() • ToString() 123 Lập trình C#.NET Boxing and Unboxing § Boxing và Unboxing là quá trình cho phép kiểu giá trị (ví dụ: integer) có thể được xử lý như là kiểu tham chiếu (objects) • Quá trình Boxing diễn ra ngầm định (implicity): chuyển đổi ngầm định kiểu giá trị sang kiểu Object • Quá trình Unboxing diễn ra tường minh (explicity):chuyển ngược từ kiểu Object về kiểu giá trị. 124 Lập trình C#.NET Boxing using System; class Boxing { public static void Main( ) { int i = 123; Console.WriteLine ("The object value = {0}", i); } } 125 Lập trình C#.NET Unboxing public class UnboxingTest { public static void Main( ) { int i = 123; //Boxing object o = i; // unboxing (must be explicit) int j = ( int ) o; Console.WriteLine( "j: {0}", j ); } } 126 Lập trình C#.NET Bài thực hành số 3 Bài 1: Xây dựng các lớp Fish, GoldFish và Shark theo thiết kế dưới đây 127 Lập trình C#.NET 4.4. Hàm chồng toán tử § Mục đích của hàm chồng toán tử (Overloading Operator) • Cho phép các lớp do người dùng định nghĩa có thể có thể có đầy đủ các chức năng như các kiểu do ngôn ngữ định nghĩa • VD: 1 lớp phân số, có thể có đầy đủ các phép toán üCộng üTrừ üNhân üChia 128 Lập trình C#.NET Hàm chồng toán tử Fraction theSum = firstFraction.Add(secondFraction); Fraction theSum = firstFraction + secondFraction; 129 Lập trình C#.NET Sử dụng từ khóa operator Khai báo public static Fraction operator+ (Fraction lhs, Fraction rhs) Fraction theSum = firstFraction + secondFraction; Fraction.operator+(firstFraction, secondFraction) Sử dụng 130 Lập trình C#.NET Bài thực hành số 3 Bài 2: Xây dựng lớp phân số (Fraction) theo thiết kế dưới đây. Sử dụng kỹ thuật chồng toán tử (Overloading Operator) để xây dựng các toán tử +, -, *, /, ==, != 131 Lập trình C#.NET 4.5.Cấu trúc struct § Struct là cấu trúc đơn giản do người dùng tự định nghĩa, khá giống với class • Có hàm tạo, thuộc tính, phương thức, toán tử, index § Struct khác class • Struct không hỗ trợ hàm hủy và cơ chế kế thừa • Struct là kiểu giá trị, không phải kiểu tham chiếu • Trong struct, các thuộc tính không được khởi gán dữ liệu khi khai báo 132 Lập trình C#.NET Định nghĩa struct [attributes] [access-modifiers] struct identifier [:interface-list] { struct-members } public struct Location { private int xVal; private int yVal; public Location(int x, int y) { xVal = x; yVal = y; } public override string ToString( ) { return ( String.Format( "{0}, {1}", xVal, yVal ) ); } public int x { get { return xVal; } set { xVal = value; } } } 133 Lập trình C#.NET Tạo struct § Sử dụng từ khóa new Location loc1 = new Location(200,300); § Không sử dụng từ khóa new (Các thuộc tính xVal và yVal phải chuyển phạm vi truy nhập thành public) Location loc1; // Không gọi tới hàm tạo loc1.xVal = 75; // Khởi gán các thuộc tính loc1.yVal = 225; 134 Lập trình C#.NET Interfaces § Một lớp hay struct thực thi (implement) interface -> đảm bảo hỗ trợ đầy đủ các thuộc tính, phương thức, sự kiện và index được định nghĩa trong interface đó § Interface thường được so sánh với lớp trừu tượng (abstract class) § Khi một lớp hay cấu trúc thực thi một interface, nó phải thực thi tất cả các thành phần của interface (thuộc tính, phương thức, sự kiện) 135 Lập trình C#.NET Định nghĩa Interface [attributes] [access-modifier] interface interface-name[:base-list] {interface-body} •Phạm vi truy nhập: public, private, protected, internal, protected internal •Interface-name: tên của interface, nên bắt đầu bằng chữ “I” Ví dụ: ICloneable, IRunable •Base-list: danh sách các interface mà nó mở rộng (extend) •Interface-body: mô tả các phương thức, các thuộc tính, mà lớp thực thi cần cài đặt (Không xác định phạm vi truy cập – mặc định là public) 136 Lập trình C#.NET Ví dụ interface IStorable { // no access modifiers, // methods are public // no implementation void Read(); void Write(object obj); int Status { get; set; } } public class Document : IStorable { // store the value for the property private int status = 0; public Document(string s) {//code} public void Read() {//code} // implement the Write method public void Write(object o) {//code} // implement the property public int Status { get { return status; } set { status = value;} } } 137 Lập trình C#.NET Thực thi nhiều interfaces § Các lớp và cấu trúc có thể implement nhiều interfaces khác nhau Ví dụ: lớp tài liệu (Document) vừa có khả năng lưu trữ (storable), vừa có khả năng nén (compressible) public class Document : IStorable, ICompressible 138 Lập trình C#.NET Mở rộng Interfaces (extending) § Có thể mở rộng interface để thêm các thuộc tính và phương thức mới interface ILoggedCompressible : ICompressible { void LogSavedBytes(); } 139 Lập trình C#.NET Kết hợp interfaces § Có thể kết hợp các interfaces lại với nhau và thêm các phương thức, thuộc tính nếu cần interface IStorableCompressible : IStorable, ILoggedCompressible { void LogOriginalSize(); } 140 Lập trình C#.NET Truy nhập các thành phần của interface § Không thể trực tiếp tạo thể hiện của interface IStorable isDoc = new IStorable(); § Truy xuất thành phần của Interface theo hai bước (hoặc gộp cả hai bước) • Tạo đối tượng của một lớp implement interface Document doc = new Document("Test Document"); • Ép kiểu đối tượng này thành thể hiện của interface IStorable isDoc = doc; 141 Lập trình C#.NET Casting to an interface § Không biết rõ một lớp implement những interface nào -> khi ép kiểu sang interface có thể phát sinh lỗi § C# hỗ trợ 2 toán tử sử dụng cho việc casting và kiểm tra • Toán tử is expression is type • Toán tử as expression as type 142 Lập trình C#.NET So sánh interface và lớp trừu tượng § Interface khá giống với lớp trừu tượng § C# sử dụng interface để thực thi kỹ thuật đa kế thừa vì C# không hỗ trợ đa kế thừa từ nhiều lớp (C++ có hỗ trợ đa kế thừa) public class StorableList : List, IStorable { // List methods here ... public void Read( ) {...} public void Write(object obj) {...} // ... } 143 Lập trình C#.NET Overriding Interface Implementations § Một lớp khi thực thi các phương thức của interface có thể chuyển đổi phương thức đó thành dạng phương thức ảo § Các lớp dẫn xuất từ lớp đó override phương thức ảo -> KỸ THUẬT ĐA HÌNH 144 Lập trình C#.NET Bài thực hành số 4 Xây dựng các lớp phương tiện giao thông dưới đây theo thiết kế 145 Lập trình C#.NET 4.7. Mảng, chỉ số và tập hợp § Mảng là một tập hợp được đánh chỉ số (indexed Collection) các đối tượng cùng kiểu § Biến mảng là đối tượng, các đối tượng mảng được khai báo thực tế là thể hiện của lớp System.Array • Đối tượng mảng có thuộc tính: IsReadOnly, Length • Đối tượng mảng có phương thức: Clear(), Copy(), Sort() 146 Lập trình C#.NET Khai báo mảng type[ ] array-name; § Cặp ngoặc vuông [ ] báo cho trình dịch C# biết là chúng ta khai báo một mảng § Type xác định kiểu dữ liệu của các phần tử trong mảng Ví dụ: int[ ] myIntArray; //Mảng integer Employer[ ] myObjectArray; //Mảng đối tượng 147 Lập trình C#.NET Giá trị mặc định khi khởi gán mảng § Khi khởi gản mảng các phần tử kiểu giá trị (value type), các phần tử được khởi gán giá trị mặc định của nó myIntArray=new int[5]; § Khi khởi gán mảng các phần tử kiểu tham chiếu (reference type), các phần tử mảng được khởi gán giá trị null -> muốn sử dụng phải tạo và gán các đối tượng cụ thể cho các phần tử của mảng myObjectArray=new Employer[5]; 148 Lập trình C#.NET Truy nhập phần tử mảng § Các phần tử mảng trong C# được đánh chỉ số, bắt đầu bằng 0 § Mảng là đối tượng, có thuộc tính Length cho biết số phần tử trong mảng -> Các phần tử của mảng được đánh chỉ số từ 0 đến Length -1 § Truy nhập phần tử mảng (VD phần tử thứ 3 của mảng myInt) thông qua toán tử chỉ số [ ] myInt[2] 149 Lập trình C#.NET Ví dụ public class Employee { private int empID; public Employee(int empID) { this.empID = empID; } public override string ToString() { return empID.ToString(); } } public class Tester { static void Main() { Employee[] empArray; empArray = new Employee[3]; // populate the array for (int i = 0; i < empArray.Length; i++) { empArray[i] = new Employee(i + 5); } for (int i = 0; i < empArray.Length; i++) { Console.WriteLine(empArray[i].ToStrin g()); } } } 150 Lập trình C#.NET Câu lệnh foreach § Câu lệnh foreach cho phép lặp qua tất cả các phần tử trong trong một mảng hay kiểu tập hợp bất kỳ nào khác foreach (type identifier in expression) statement Kiểu dữ liệu của phần tử trong mảng / tập hợp Tên biến lặp (tham chiếu đến phần tử mảng tại mỗi vòng lặp) Tên mảng/ Tập hợp 151 Lập trình C#.NET Ví dụ Khi các phần tử mảng là kiểu giá trị foreach ( int i in intArray ) { Console.WriteLine( i.ToString( ) ); } Khi các phần tử mảng là kiểu tham chiếu foreach ( Employee e in empArray ) { Console.WriteLine( e.ToString( ) ); } 152 Lập trình C#.NET Từ khóa params § Từ khóa params cho phép truyền một loạt các tham số cho phương thức mà không phải định nghĩa mảng một cách tường minh. public void DisplayVals(params int[] intVals) 153 Lập trình C#.NET Ứng dụng từ khóa params public class Tester { static void Main() { Tester t = new Tester(); t.DisplayVals(5, 6, 7, 8); int[] explicitArray = new int[5] { 1, 2, 3, 4, 5 }; t.DisplayVals(explicitArray); } public void DisplayVals(params int[] intVals) { foreach (int i in intVals) { Console.WriteLine("DisplayVals {0}", i); } } } 154 Lập trình C#.NET Bài thực hành số 5 Bài 1: Viết một phương thức FindMinMax in ra giá trị số nguyên lớn nhất và nhỏ nhất trong số các tham số đầu vào là một dãy các số nguyên bất kỳ VD: Gọi hàm FindMinMax(3,1,5,8,0,9,-2) Kết quả in ra màn hình - Số nguyên nhỏ nhât là: -2 - Số nguyên lớn nhất là: 9 155 Lập trình C#.NET 4.8. Strings public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable § String là lớp đóng -> Không thể tạo lớp kế thừa lớp String § String implement 4 interfaces IComparable, ICloneable, IConvertible và IEnumerable cho phép có thể so sánh, sao chép, chuyển đổi và sử dụng kiểu liệt kê § Mỗi đối tượng của lớp String là một chuỗi cố định các ký tự Unicode -> các phương thức làm thay đổi đối tượng của lớp thực chất là tạo ra một bản sao đã được sửa đổi, chuỗi nguyên gốc vẫn được giữ trong bộ nhớ cho đến khi bộ thu gom rác xử lý. 156 Lập trình C#.NET Tạo chuỗi §Cách thông thường string literalString = "This is a string literal \n"; §Tạo chuỗi đúng với nguyên mẫu (verbatim string) sử dụng từ khóa @ string verbatimString=@"\n Pham Van Thuan \t Tel: 0985905253\\"; public class Test { public static void Main() { String literalString = "Pham Van Thuan \n"; Console.WriteLine(literalString); String verbatimString = @"\n Pham Van Thuan \t Tel: 0985905253\\"; Console.WriteLine(verbatimString); Console.Read(); } } 157 Lập trình C#.NET Thao tác chuỗi § Lớp string hỗ trợ các phương thức cho phép so sánh, tìm kiếm và xử lý chuỗi Định dạng một chuỗiFormat() Kiểm tra hai chuỗi có giống nhau khôngEquals() Tạo bản sao của một chuỗiCopy() Phương thức nối chuỗiConcat() Phương thức so sánh hai chuỗiCompare() Thuộc tính cho biết chuỗi rỗngEmpty Mô tảThuộc tính, phương thức 158 Lập trình C#.NET Ví dụ static void Main() { string str1 = "Hanoi"; string str2 = "La thu do cua Viet Nam"; string str3 = "HANOI"; //So sanh chuoi, tra ve 0 neu giong nhau int result = string.Compare(str1, str3); Console.WriteLine("Ket qua so sanh hai chuoi {0} va {1} la {2}", str1, str3, result); Console.ReadLine(); //Noi chuoi string str4 = string.Concat(str1, " ", str2); string str5 = str1 + " " + str2; Console.WriteLine("Ket qua noi chuoi {0} va {1}: \n + Su dung phuong thuc Concat: {2} \n + Su dung ham chong toan tu +: {3}", str1, str2, str4, str5); Console.ReadLine(); //Lay ve chieu dai chuoi Console.WriteLine("Chieu dai cua chuoi \"{0}\" la {1}", str2, str2.Length); Console.ReadLine(); } 159 Lập trình C#.NET Xử lý chuỗi động (Dynamic string) § Lớp System.Text.Stringbuilder được sử dụng để tạo và chỉnh sửa chuỗi • Không giống như string, các đối tượng của lớp Stringbuilder có thể thay đổi • Khi chỉnh sửa, sự thay đổi được thực hiện trên chính đối tượng chứ không phải trên bản sao của đối tượng 160 Lập trình C#.NET Ví dụ sử dụng Stringbuilder static void Main() { // create some strings to work with string s1 = "Hi, Good morning"; // array of delimiters to split the sentence with char[] delimiters = new char[]{' ',','}; // use a StringBuilder class to build the output string StringBuilder output = new StringBuilder(); int ctr = 1; // split the string and then iterate over the // resulting array of strings foreach (string subString in s1.Split(delimiters)) { // AppendFormat appends a formatted string output.AppendFormat("{0}: {1}\n", ctr++, subString); } Console.WriteLine(output); } 161 Lập trình C#.NET 4.9. Handling Exceptions § C# xử dụng kỹ thuật bắt ngoại lệ (Handling Exception để bắt và xử lý lỗi (errror) cũng như các ngoại lệ phát sinh trong quá trình thực thi chương trình) § Phân loại bug, error và exception • Bug: lỗi do người lập trình, cần được loại bỏ trước khi hoàn thành phần mềm • Error: lỗi phát sinh do người dùng, ví dụ người dùng nhập sai định dạng dữ liệu -> phải kiểm tra dữ liệu đầu vào • Exception: lỗi bất thường, ví dụ như hết bộ nhớ, lỗi chia cho 0s 162 Lập trình C#.NET Ném (throwing) và bắt (catching) ngoại lệ § Để báo hiệu một điều kiện bất thường xuất hiện trong quá trình thực thi, thực hiện ném ngoại lệ throw new System.Exception(); § Khi một ngoại lệ được tung ra, chương trình ngay lập tức sẽ dừng lại và CLR sẽ tìm , kiểm tra chương trình bắt ngoại lệ, nếu không tìm thấy nó sẽ kết thúc chương trình 163 Lập trình C#.NET Ngoại lệ được báo trong chế độ debug 164 Lập trình C#.NET Lỗi dừng chương trình khi chạy thực tế 165 Lập trình C#.NET Ví dụ public class Test { public static void Main() { Console.WriteLine("Enter Main..."); Test t = new Test(); t.Func1(); Console.WriteLine("Exit Main..."); } public void Func1() { Console.WriteLine("Enter Func1..."); Func2(); Console.WriteLine("Exit Func1..."); } public void Func2() { Console.WriteLine("Enter Func2..."); throw new System.Exception(); Console.WriteLine("Exit Func2..."); } } 166 Lập trình C#.NET Ngoại lệ xuất hiện 167 Lập trình C#.NET Chi tiết ngoại lệ 168 Lập trình C#.NET Câu lệnh trycatch § C# sử dụng cấu trúc trycatchfinally để kiểm tra, bắt và xử lý ngoại lệ try { //Lệnh có thể phát sinh ngoại lệ, cần kiểm tra } catch(Exception e) { //Bắt và xử lý ngoại lệ nếu có } Finally { //Đoạn mã luôn thực thi khi xuất hiện ngoại lệ } 169 Lập trình C#.NET Câu lệnh trycatch § Có thể có nhiều đoạn lệnh catch trong một câu lệnh trycatch tương ứng với nhiều ngoại lệ khác nhau § Đoạn lệnh trycatch có thể đặt trong phương thức có thể phát sinh ngoại lệ hoặc đặt ở cấp cao hơn, phương thức triệu gọi đoạn mã có thể phát sinh ngoại lệ 170 Lập trình C#.NET Bài thực hành số 5 Bài 2: Viết một phương thức float Divide(int num1, int num2) § Kiểm tra và bắt ngoại lệ bằng câu lệnh trycatch trong hai trường hợp • Bắt trong thân hàm • Bắt trong lời gọi hàm 171 Lập trình C#.NET Nội dung môn học Chương 1: Giới thiệu C# và .NET Framework Chương 2: Giới thiệu môi trường phát triển ứng dụng Visual Studio .NET 2005 Chương 3: C# căn bản Chương 4: Hướng đối tượng trong C# Chương 5: Lập trình ứng dụng với C# 172 Lập trình C#.NET Nội dung chương 5 5.1. Mở đầu về lập trình Windows Form 5.2. Một số điều khiển thông dụng cho Windows Form 5.3. Kết nối cơ sở dữ liệu sử dụng ADO.NET 5.4. Lập báo cáo sử dụng Crystal Report.NET 5.5. Lập trình Socket 173 Lập trình C#.NET 5.1. Mở đầu về lập trình Windows Form Xây dựng ứng dụng Hello World 174 Lập trình C#.NET Xây dựng ứng dụng Hello World § Tạo dự án kiểu Windows Application § Thiết kế giao diện • 1 label • 1 textbox • 2 button: Hello, Good bye 175 Lập trình C#.NET Các file cấu thành class frmHello §Form1.cs: chứa mã chương trình của người dùng §Form1.Designer.cs: do bộ VS 2005 tự động sinh trong quá trình thiết kế 176 Lập trình C#.NET Form1.cs 177 Lập trình C#.NET Form1.Designer.cs 178 Lập trình C#.NET Viết mã § Sự kiện người dùng click vào nút Hello private void btnHello_Click(object sender, EventArgs e) { MessageBox.Show("Hello "+txtName.Text); } Phương thức Show của đối tượng MessageBox -Hiển thị thông báo -Hiển thị các nút bấm tùy chọn, tương tác người dùng (OK, Cancel, Yes, No) 179 Lập trình C#.NET Viết mã (tiếp) § Sự kiện người dùng click vào nút Good bye private void btnGoodBye_Click(object sender, EventArgs e) { MessageBox.Show("Bye bye!"); Application.Exit(); } Lớp Application cung cấp các thuộc tính và phương thức tĩnh để làm việc với ứng dụng Application.Exit(); //Đóng ứng dụng 180 Lập trình C#.NET 5.2. Một số điều khiển thông dụng trong Windows Form § Label và Linklabel § Textbox và RichTextBox § Button § Check box và Radio button § Combobox § Listbox 181 Lập trình C#.NET Label § Điều khiển label chứa văn bản tĩnh trên form § Một số thuộc tính thường dùng • Text • Text align § C# hỗ trợ điều khiển Linklabel (kế thừa lớp Label) cho phép link đến các liên kết (website, forum). Một số thuộc tính thường dùng • Text • LinkArea • LinkBehavior 182 Lập trình C#.NET Textbox § Điều khiển Textbox cho phép người dùng nhập thông tin hoặc hiển thị các thông tin dưới dạng văn bản • Một dòng • Nhiều dòng 183 Lập trình C#.NET RichTextBox § Cho phép khả năng định dạng, chỉnh sửa mạnh hơn nhiều so với điều khiển textbox 184 Lập trình C#.NET Check box và Radio button § Check box: thiết lập trạng thái của check box qua thuộc tính CheckState • CheckState=Checked • CheckState=Unchecked • CheckState=Indeterminate § Radio button: chọn duy nhất một trong nhiều tùy chọn khác nhau 185 Lập trình C#.NET List Control § List controls bao gồm ba điều khiển cơ bản: Listbox, CheckedListBox và ComboBox • Có thể đưa dữ liệu vào bằng lệnh Add • Gắn điều khiển với một nguồn dữ liệu sẵn có (Data binding) § Các điều khiển này đều kế thừa từ lớp trừu tượng ListControl 186 Lập trình C#.NET Bài thực hành số 6 187 Lập trình C#.NET 5.3. Kết nối cơ sở dữ liệu sử dụng ADO.NET § Mô hình dữ liệu quan hệ § Một số câu truy vấn cơ bản § Kết nối cơ sở dữ liệu sử dụng ADO.NET 188 Lập trình C#.NET § Cơ sở dữ liệu: Là sự lưu trữ dữ liệu có tổ chức. § Hệ quản lý cơ sở dữ liệu (DBMS): • Cung cấp cơ chế lưu trữ, quản lý dữ liệu một cách phù hợp với định dạng dữ liệu. • Cho phép lưu trữ và truy cập tới cơ sở dữ liệu mà không cần biết về những khai báo bên trong cơ sở dữ liệu. • Ví dụ như SQL Server, Microsoft Access là các hệ quản lý cơ sở dữ liệu. Cơ sở dữ liệu quan hệ 189 Lập trình C#.NET Mô hình Cơ sở dữ liệu quan hệ § Biểu diễn dữ liệu một cách logic • Có thể xem xét các mối quan hệ mà không cần quan tâm đến cấu trúc vật lý của dữ liệu § Bao gồm các bảng • Các hàng được gọi là các mẩu tin (records) • Các cột được gọi là các trường ( fields) • Khoá chính (Primary key) một hàng phải có khóa chính nhằm phân biệt nó với các hàng khác. Do đó khóa chính phải có giá trị duy nhất và không có giá trị null 190 Lập trình C#.NET § Khóa ngoại (foreign key): trong trường hợp một nhân viên mua nhiều hàng hóa thì trên bảng Order, ngoài khóa chính (thường là số hiệu hàng hóa) còn lặp lại số thẻ nhân viên (trong bảng Employee). Lúc này số thẻ nhân viên gọi là khóa ngoại của bảng Order. Khóa ngoại dùng để tìm kiếm các giá trị trong bảng con (bảng Order). Mô hình Cơ sở dữ liệu quan hệ 191 Lập trình C#.NET Ta có cơ sở dữ liệu của bảng Employee và bảng Product như sau: khóa chính của bảng Employee khóa chính của bảng Product khóa ngoại của bảng Product Mô hình Cơ sở dữ liệu quan hệ 192 Lập trình C#.NET Quan hệ (relationship): được thiết lập giữa hai bảng dữ liệu với nhau, có ba loại quan hệ chính. • Quan hệ 1-1: quan hệ trực tiếp giữa 2 bảng dữ liệu. Ví dụ bạn có 2 bảng Person1, Person2 thì quan hệ Kết hôn là quan hệ 1-1. Một cách khác khi mà 2 bảng có quan hệ thông qua 2 khóa chính thì quan hệ là 1-1. • Quan hệ 1-N: ứng với một hàng trong bảng này có nhiều hàng trong bảng khác. Chẳng hạn như quan hệ giữa 2 bảng Employee và Order như vừa rồi là quan hệ 1-N. • Quan hệ N-N: được thiết lập khi một hàng trong Parent table có nhiều hàng trong Child table và ngược lại. Mô hình Cơ sở dữ liệu quan hệ 193 Lập trình C#.NET § Tính toàn vẹn dữ liệu (Data Integrity), được định nghĩa là không tồn tại dữ liệu dư thừa, bao gồm: • Dữ liệu nhập (Entity Integrity): mọi hàng phải có một giá trị duy nhất trong trường khóa chính của nó. • Ràng buộc toàn vẹn (Referential Integrity): mọi giá trị trường khóa ngoại của bảng này phải xuất hiện trong trường khóa chính của bảng khác. • Toàn vẹn miền (Domain Integrity): dữ liệu nhập vào trong cột phải phù hợp với định dạng và kiểu dữ liệu đã khai báo. Mô hình Cơ sở dữ liệu quan hệ 194 Lập trình C#.NET Ví dụ tblUsers tblMemos tblMeetings 195 Lập trình C#.NET Ví dụ 196 Lập trình C#.NET SQL-Ngôn ngữ truy vấn có cấu trúc § Được dùng để yêu cầu dữ liệu (thực hiện truy vấn ) và thao tác trên dữ liệu đó § Để thực hiện các lệnh SQL, bạn sử dụng SQL Query Analyzer. Có thể mở trực tiếp từ cửa sổ SQL Server Enterprise Manager bằng cách chọn Tools\SQL Query Analyzer như sau 197 Lập trình C#.NET SQL-Ngôn ngữ truy vấn có cấu trúc 198 Lập trình C#.NET Truy vấn SELECT § Chức năng: Trích thông tin từ một hay nhiều bảng trong một CSDL. § Cú pháp: SELECT danh_sách_các_cột FROM tên_bảng (Dấu * cho phép trích mẩu tin với tất cả các cột trong bảng.) 199 Lập trình C#.NET Mệnh đề WHERE § Chức năng: Truy xuất dữ liệu trong bảng theo các điều kiện nào đó. § Cú pháp: SELECT tên_cột FROM tên_bảng WHERE tên_cột phép_toán giá_trị Phép toán Mô tả = So sánh bằng So sánh không bằng > Lớn hơn < Nhỏ hơn >= Lớn hơn hoặc bằng <= Nhỏ hơn hoặc bằng BETWEEN Nằm giữa một khoảng LIKE So sánh mẫu chuỗi 200 Lập trình C#.NET § Chức năng: Sắp xếp kết quả trả về theo một tiêu chuẩn bất kỳ. § Ví dụ: Ta có bảng Orders sau: Lệnh SELECT Company, OrderNumber FROM Orders ORDER BY Company cho kết quả Mệnh đề ORDER BY 201 Lập trình C#.NET § Ta cũng có thể sắp xếp theo thứ tự giảm dần của OrderNumber bằng cách đánh lệnh: SELECT Company, OrderNumber FROM Orders ORDER BY OrderNumber DESC Kết quả trả về: Ngược lại, ASC sắp xếp theo thứ tự tăng dần. Mệnh đề ORDER BY 202 Lập trình C#.NET Truy vấn thêm mới INSERT § Chức năng: Chèn một hàng vào trong bảng. § Cú pháp: INSERT INTO tên_bảng VALUES (giá_trị_1, giá_trị_2,....) Ta cũng có thể chỉ rõ các cột/trường nào cần chèn dữ liệu: INSERT INTO tên_bảng (cột_1, cột_2,...) VALUES (giá_trị_1, giá_trị_2,....) 203 Lập trình C#.NET Truy vấn thêm mới INSERT Ví dụ: Ta có bảng Persons như sau: Câu lệnh SQL sau: INSERT INTO Persons (LastName, Address) VALUES ('Rasmussen', 'Storgt 67') sẽ tạo ra kết quả trong bảng Persons : 204 Lập trình C#.NET Truy vấn cập nhật UPDATE § Chức năng: Cập nhật hay sửa đổi dữ liệu đã có trong bảng. § Cú pháp: UPDATE tên_bảng SET tên_cột = giá_trị_mới WHERE tên_cột = giá_trị 205 Lập trình C#.NET Truy vấn cập nhật UPDATE Ví dụ ta có bảng Person sau: Để bổ xung thêm phần tên cho người có họ là Rasmussen ta đánh lệnh sau: UPDATE Person SET FirstName = 'Nina' WHERE LastName = 'Rasmussen‘ Kết quả trả về: 206 Lập trình C#.NET Truy vấn xóa DELETE § Chức năng: Xoá các dòng ra khỏi bảng. § Cú pháp: DELETE FROM tên_bảng WHERE tên_cột = giá_trị § Ví dụ xoá người có tên Nina Rasmussen: DELETE FROM Person WHERE LastName = 'Rasmussen' 207 Lập trình C#.NET ADO.NET § ADO (Active Data Object) đang là một đối tượng phổ biến trong lập trình cơ sở dữ liệu, bạn sử dụng ADO kết nối với bất kỳ cơ sở dữ liệu tương thích. Nó cung cấp hệ giao tiếp lập trình ứng dụng API (application program interface) để truy nhập vào cơ sở dữ liệu hệ thống. § ADO.NET là đối tượng được sử dụng trong .NET 208 Lập trình C#.NET Lớp Connection § .NET Data Provider là một phần của mô hình lập trình ADO.NET, bao gồm 4 lớp sau: • Connection: lớp kết nối cơ sở dữ liệu. • DataAdapter: lớp chứa dữ liệu. • Command: lớp chứa lệnh. • DataReader: lớp đọc dữ liệu. § Bạn cần khai báo Connection khi muốn truy cập loại dữ liệu nguồn. Có 3 loại kết nối Microsoft cung cấp trong .Net Framework bao gồm OdbcConnection, OleDbConnection ,SqlConnection. § SqlConnection tối ưu hóa cho quá trình kết nối với CSDL SQL Server 7.0 và phiên bản mới hơn. Trong khi Odbc và OleDb được sử dụng cho MS Access hay MySQL, 209 Lập trình C#.NET Lớp DataAdapter § Lớp DataAdapter dùng để nhận dữ liệu từ dữ liệu nguồn, sau đó chuyển vào DataSet và các lớp quan hệ như DataTable (xem về lớp không kết nối ở phần sau). Nó cũng có trách nhiệm cập nhật dữ liệu thay đổi vào dữ liệu nguồn. § Các phát biểu trong SQL được “nhúng” vào C# bằng đối tượng Command. Bộ điều hợp sẽ sử dụng đối tượng Command để truy vấn và cập nhật dữ liệu. Vì thế để làm việc được với DataAdapter, bạn phải chỉ rõ và sử dụng đối tượng Command. § DataAdapter chia thành 3 lớp cụ thể: OleDbDataAdapter , OdbcDataAdapter, SqlDataAdapter 210 Lập trình C#.NET 5.4. Lập báo cáo sử dụng Crystal Report § Sử dụng nguồn dữ liệu qua ODBC § Sử dụng nguồn dữ liệu qua ADO.NET 211 Lập trình C#.NET 5.5. Lập trình socket § Socket là gì? Địa chỉ IP (IP Address) Số hiệu cổng (Port Number) Socket 212 Lập trình C#.NET Một số port thông dụng POP3110 HTTP80 SMTP25 FTP Control21 FTP Data20 Giao thức sử dụngSố hiệu cổng 213 Lập trình C#.NET Giao thức truyền tin § Các gói tin được truyền theo hai giao thức chính • UDP (User Datagram Protocol): không đảm bảo được thông tin đến được đích và đúng thứ tự -> Truyền thông tin cần tốc độ nhanh, không cần tuyệt đối chính xác (Voice over IP, Game online) • TCP (Transmission Control Protocol):đảm bảo chuyển giao dữ liệu đến nơi nhận một cách đáng tin cậy và đúng thứ tự. (Web, email, truyền file) 214 Lập trình C#.NET Ví dụ giao thức UDP

Các file đính kèm theo tài liệu này:

  • pdftailieu.pdf
Tài liệu liên quan