CHƯƠNG 1 C# và .NET framework Để cung cấp một môi trường lập trình hướng đối tượng vững chắc, trong đó mã nguồn đốitượng được lưu trữ và thực thi một cách cục bộ.. Trongkhi
Trang 1ĐỀ CƯƠNG BÀI GIẢNG LẬP TRÌNH NET
(TÀI LIỆU DÙNG CHO SINH VIÊN ĐẠI HỌC CÔNG NGHỆ THÔNG TIN)
Mã số môn học: TI2233
Số tín chỉ: 02
Lý thuyết: 24 tiết Thực hành: 06 tiết
Trang 2MỤC LỤC
MỤC LỤC 1
CHƯƠNG 1: C# và NET framework 3
1.1 .NET framework 3
1.1.1 Common Language Runtime (CLR) 4
1.1.2 Thư viện lớp NET Framework 5
1.2 Ngôn ngữ C# 5
CHƯƠNG 2: Lập trình C# căn bản 7
2.1 Bắt đầu với Console Application 7
2.1.1 Tạo Project 7
2.1.2 Chạy chương trình 8
2.2 Biến và phạm vi hoạt động của biến trong C# 8
2.2.1 Biến 8
2.2.2 Phạm vi hoạt động của biến 8
2.3 Hằng 8
2.4 Kiểu dữ liệu 9
2.5 Cấu trúc điều kiện 10
2.5.1 Câu lệnh điều kiện if else 10
2.5.2 Câu lệnh switch case 10
2.6 Cấu trúc lặp 10
2.6.1 Cấu trúc lặp for 10
2.6.2 Cấu trúc lặp while 11
2.6.3 Cấu trúc lặp do while 11
2.7 Mảng 11
2.7.1 Mảng một chiều 11
2.7.2 Mảng hai chiều 11
CHƯƠNG 3: Lập trình hướng đối tượng trong C# 13
3.1 Lớp 13
3.2 Đối tượng 14
3.3 Thuộc tính 14
3.4 Phương thức 15
3.5 Nạp chồng toán tử 15
3.6 Kế thừa 16
CHƯƠNG 4: Lập trình ứng dụng Windows 19
4.1 Ứng dụng Form và Label 19
4.1.1 Form 19
4.1.2 Điều khiển Label 20
4.1.3 Ứng dụng Form và Label 21
4.2 Điều khiển TextBox và Button 22
4.2.1 Điều khiển TextBox 22
4.2.2 Điều khiển Button 23
4.3 Điều khiển ComboBox, CheckBox và RadioButton 24
4.3.1 Điều khiển ComboBox 24
4.3.2 Điều khiển CheckBox 25
4.3.3 Điều khiển RadioButton 25
4.4 MDI Form và MenuStrip 27
4.4.1 MDI Form 27
4.4.2 MenuStrip 27
Trang 3CHƯƠNG 5: Tương tác cơ sở dữ liệu 30
5.1 Kết nối ADO.NET 30
5.1.1 Khái niệm 30
5.1.2 Kiến trúc 30
5.1.3 Các namespace của ADO.NET 31
5.2.2 Đối tượng SqlCommand 32
5.3 Đối tượng SqlDataReader 33
5.4 Đối tượng SqlDataAdapter, DataSet và DataGridView 34
5.4.1 Đối tượng SqlDataAdapter 34
5.4.2 Đối tượng DataSet 34
5.4.3 Đối tượng DataGridView 34
TÀI LIỆU THAM KHẢO 37
Trang 4CHƯƠNG 1 C# và NET framework
Để cung cấp một môi trường lập trình hướng đối tượng vững chắc, trong đó mã nguồn đốitượng được lưu trữ và thực thi một cách cục bộ Thực thi cục bộ nhưng được phân tántrên Internet, hoặc thực thi từ xa
Để cung cấp một môi trường thực thi mã nguồn mà tối thiểu được việc đóng gói phầnmềm và sự tranh chấp về phiên bản
Để cung cấp một môi trường thực thi mã nguồn mà đảm bảo việc thực thi an toàn mãnguồn, bao gồm cả việc mã nguồn được tạo bởi hãng thứ ba hay bất cứ hãng nào mà tuânthủ theo kiến trúc NET
Để cung cấp một môi trường thực thi mã nguồn mà loại bỏ được những lỗi thực hiện cácscript hay môi trường thông dịch
Để làm cho những người phát triển có kinh nghiệm vững chắc có thể nắm vững nhiềukiểu ứng dụng khác nhau Như là từ những ứng dụng trên nền Windows đến những ứngdụng dựa trên web
Để xây dựng tất cả các thông tin dựa triên tiêu chuẩn công nghiẹ ̂p để đảm bảo rằng mãnguồn trên NET có thể tích hợp với bất cứ mã nguồn khác
.NET Framework có hai thành phần chính: Common Language Runtime (CLR) và thưviện lớp NET Framework CLR là nền tảng của NET Framework Chúng ta có thể hiểu runtimenhư là một agent quản lý mã nguồn khi nó được thực thi, cung cấp các dịch vụ cốt lõi như: quản
lý bộ nhớ, quản lý tiểu trình, và quản lý từ xa Ngoài ra nó còn thúc đẩy việc sử dụng kiểu antoàn và các hình thức khác của việc chính xác mã nguồn, đảm bảo cho việc thực hiện được bảo
Trang 5mật và mạnh mẽ Thật vậy, khái niệm quản lý mã nguồn là nguyên lý nền tảng của runtime Mãnguồn mà đích tới runtime thì được biết như là mã nguồn được quản lý (managed code) Trongkhi đó mã nguồn mà không có đích tới runtime thì được biết như mã nguồn không được quản lý(unmanaged code).
Thư viện lớp, một thành phần chính khác của NET Framework là một tập hợp hướng đốitượng của các kiểu dữ liệu được dùng lại, nó cho phép chúng ta có thể phát triển những ứng dụngtừ những ứng dụng truyền thống command-line hay những ứng dụng có giao diện đồ họa (GUI)đến những ứng dụng mới nhất được cung cấp bởi ASP.NET, như là Web Form và dịch vụ XMLWeb
1.1.1 Common Language Runtime (CLR)
Như đã đề cập thì CLR thực hiện quản lý bộ nhớ, quản lý thực thi tiểu trình, thực thi mãnguồn, xác nhận mã nguồn an toàn, biên bịch và các dịch vụ hệ thống khác Những đặc tính trên
là nền tảng cơ bản cho những mã nguồn được quản lý chạy trên CLR
Do chú trọng đến bảo mật, những thành phần được quản lý được cấp những mức độquyền hạn khác nhau, phụ thuộc vào nhiều yếu tố nguyên thủy của chúng như: liên quan đếnInternet, hệ thống mạng trong nhà máy, hay một máy tính cục bộ Điều này có nghĩa rằng, mộtthành phần được quản lý có thể có hay không có quyền thực hiện một thao tác truy cập tập tin,thao tác truy cập registry, hay các chức năng nhạy cảm khác
CLR thúc đẩy việc mã nguồn thực hiện việc truy cập được bảo mật Ví dụ, người sử dụnggiới hạn rằng việc thực thi nhúng vào trong một trang web có thể chạy được hoạt hình trên mànhình hay hát một bản nhạc, nhưng không thể truy cập được dữ liệu riêng tư, tập tin hệ thống, haytruy cập mạng Do đó, đặc tính bảo mật của CLR cho phép những phần mềm đóng gói trênInernet có nhiều đặc tính mà không ảnh hưởng đến việc bảo mật hệ thống
CLR còn thúc đẩy cho mã nguồn được thực thi mạnh mẽ hơn bằng việc thực thi mãnguồn chính xác và sự xác nhận mã nguồn Nền tảng của việc thực hiện này là Common TypeSystem (CTS) CTS đảm bảo rằng những mã nguồn được quản lý thì được tự mô tả (self-describing) Sự khác nhau giữa Microsoft và các trình biên dịch ngôn ngữ của hãng thứ ba làviệc tạo ra các mã nguồn được quản lý có thể thích hợp với CTS Điều này thì mã nguồn đượcquản lý có thể sử dụng những kiểu đu ̛ợc quản lý khác và những thể hiện, trong khi thúc đẩynghiêm ngặt việc sử dụng kiểu dữ liệu chính xác và an toàn
Thêm vào đó, môi trường được quản lý của runtime sẽ thực hiện việc tự động xử lýlayout của đối tượng và quản lý những tham chiếu đến đối tượng, giải phóng chúng khi chúngkhông còn được sử dụng nữa Việc quản lý bộ nhớ tự động này còn giải quyết hai lỗi chung củaứng dụng: thiếu bộ nhớ và tham chiếu bộ nhớ không hợp lệ
Trong khi runtime được thiết kế cho những phần mềm của tương lai, nó cũng hỗ trợ chophân mềm ngày nay và trước đây Khả năng hoạt động qua lại giữa mã nguồn được quản lý và
mã nguồn không được quản lý cho phép người phát triển tiếp tục sử dụng những thành phần cầnthiết của COM và DLL
Rutime được thiết kế để cải tiến hiệu suất thực hiện Mặc dù CLR cung cấp nhiều các tiêuchuẩn dịch vụ runtime, nhưng mã nguồn được quản lý không bao giờ được dịch Có một đặc tính
Trang 6gọi là Just-in-Time (JIT) biên dịch tất cả những mã nguồn được quản lý vào trong ngôn ngữ máycủa hệ thống vào lúc mà nó được thực thi Khi đó, trình quản lý bộ nhớ xóa bỏ những phân mảnhbộ nhớ nếu có thể được và gia tăng tham chiếu bộ nhớ cục bộ, và kết quả gia tăng hiệu quả thựcthi.
1.1.2 Thư viện lớp NET Framework
Thư viện lớp NET Framework là một tập hợp những kiểu dữ liệu được dùng lại và đượckết hợp chặt chẽ với Common Language Runtime Thư viện lớp là hướng đối tượng cung cấpnhững kiểu dữ liệu mà mã nguồn được quản lý của chúng ta có thể dẫn xuất Điều này không chỉlàm cho những kiểu dữ liệu của NET Framework dễ sử dụng mà còn làm giảm thời gian liênquan đến việc học đặc tính mới của NET Framework Thêm vào đó, các thành phần của cáchãng thứ ba có thể tích hợp với những lớp trong NET Framework
Cũng như mong đợi của người phát triển với thư viện lớp hướng đối tượng, kiểu dữ liệu NET Framework cho phép người phát triển thiết lập nhiều mức độ thông dụng của việc lập trình,bao gồm các nhiệm vụ như: quản lý chuỗi, thu thập hay chọn lọc dữ liệu, kết nối với cơ cở dữliệu, và truy cập tập tin Ngoài những nhiệm vụ thông dụng trên Thư viện lớp còn đưa vàonhững kiểu dữ liệu để hỗ trợ cho những kịch bản phát triển chuyên biẹ ̂t khác Ví dụ người pháttriển có thể sử dụng NET Framework để phát triển những kiểu ứng dụng và dịch vụ như sau:
1.2 Ngôn ngữ C#
Ngôn ngữ C# khá đơn giản, chỉ khoảng 80 từ khóa và hơn mười mấy kiểu dữ liệu đượcxây dựng sẵn Tuy nhiên, ngôn ngữ C# có ý nghĩa cao khi nó thực thi những khái niệm lập trìnhhiện đại C# bao gồm tất cả những hỗ trợ cho cấu trúc, thành phần component, lạ ̂p trình hướngđối tượng Những tính chất đó hiện diện trong một ngôn ngữ lập trình hiện đại Và ngôn ngữ C#hội đủ những điều kiện như vậy, hơn nữa nó được xây dựng trên nền tảng của hai ngôn ngữmạnh nhất là C++ và Java
Ngôn ngữ C# được phát triển bởi đội ngũ kỹ sư của Microsoft, trong đó người dẫn đầu làAnders Hejlsberg và Scott Wiltamuth Cả hai người này điều là những người nổi tiếng, trong đóAnders Hejlsberg được biết đến là tác giả của Turbo Pascal, một ngôn ngữ lập trình PC phổ biến
Và ông đứng đầu nhóm thiết kế Borland Delphi, một trong những thành công đầu tiên của việcxây dựng môi trường phát triển tích hợp (IDE) cho lập trình client/server
Phần cốt lõi hay còn gọi là trái tim của bất cứ ngôn ngữ lạ ̂p trình hướng đối tượng là sự hỗ trợcủa nó cho việc định nghĩa và làm việc với những lớp Những lớp thì định nghĩa những kiểu dữliệu mới, cho phép người phát triển mở rộng ngôn ngữ để tạo mô hình tốt hơn để giải quyết vấn
Trang 7đề Ngôn ngữ C# chứa những từ khóa cho việc khai báo những kiểu lớp đối tượng mới và nhữngphương thức hay thuộc tính của lớp, và cho việc thực thi đóng gói, kế thừa, và đa hình, ba thuộctính cơ bản của bất cứ ngôn ngữ lập trình hướng đối tượng.
Trong ngôn ngữ C# mọi thứ liên quan đến khai báo lớp điều đu ̛ợc tìm thấy trong phầnkhai báo của nó Định nghĩa một lớp trong ngôn ngữ C# không đòi hỏi phải chia ra tập tin header
và tập tin nguồn giống như trong ngôn ngữ C++ Hơn thế nữa, ngôn ngữ C# hỗ trợ kiểu XML,cho phép chèn các tag XML để phát sinh tự động các document cho lớp
C# cũng hỗ trợ giao diện interface, nó được xem như một cam kết với một lớp cho nhữngdịch vụ mà giao diện quy định Trong ngôn ngữ C#, một lớp chỉ có thể kế thừa từ duy nhất mọ ̂tlớp cha, tức là không cho đa kế thừa như trong ngôn ngữ C++, tuy nhiên một lớp có thể thực thinhiều giao diện Khi một lớp thực thi một giao diện thì nó sẽ hứa là nó sẽ cung cấp chức năngthực thi giao diện
Trong ngôn ngữ C#, những cấu trúc cũng được hỗ trợ, nhưng khái niệm về ngữ nghĩa của
nó thay đổi khác với C++ Trong C#, một cấu trúc được giới hạn, là kiểu dữ liệu nhỏ gọn, và khitạo thể hiện thì nó yêu cầu ít hơn về hệ điều hành và bộ nhớ so với một lớp Một cấu trúc thìkhông thể kế thừa từ một lớp hay được kế thừa nhưng một cấu trúc có thể thực thi một giao diện
Ngôn ngữ C# cung cấp những đặc tính hướng thành phần (component-oriented), như lànhững thuộc tính, những sự kiện Lập trình hướng thành phần được hỗ trợ bởi CLR cho phép lưutrữ metadata với mã nguồn cho một lớp Metadata mô tả cho một lớp, bao gồm những phươngthức và những thuộc tính của nó, cũng như những sự bảo mật cần thiết và những thuộc tính khác
Mã nguồn chứa đựng những logic cần thiết để thực hiện những chức năng của nó Do vậy, mộtlớp được biên dịch như là một khối self-contained, nên môi trường hosting biết được cách đọcmetadata của một lớp và mã nguồn cần thiết mà không cần những thông tin khác để sử dụng nó
Một lưu ý cuối cùng về ngôn ngữ C# là ngôn ngữ này cũng hỗ trợ viẹ ̂c truy cập bộ nhớtrực tiếp sử dụng kiểu con trỏ của C++ và từ khóa cho dấu ngoạ ̆c [] trong toán tử Các mã nguồnnày là không an toàn (unsafe) Và bộ giải phóng bộ nhớ tự đọ ̂ng của CLR sẽ không thực hiệnviệc giải phóng những đối tượng được tham chiếu bằng sử dụng con trỏ cho đến khi chúng đượcgiải phóng
C) TÀI LIỆU HỌC TẬP
1 Phương Lan, Lập trình Windows với C#.Net, Nhà xuất bản Lao động – Xã hội
2 Phạm Hữu Khang, Đoàn Thiện Ngân, C# 2005 Tập 1, 2, 3, 4, 5, Nhà xuất bản Laođộng - Xã
hội
D) CÂU HỎI, BÀI TẬP, NỘI DUNG ÔN TẬP VÀ THẢO LUẬN
Câu hỏi 1: Một chương trình C# có thể chạy trên bất cứ máy nào?
Câu hỏi 2: Nếu muốn đưa chương trình mà ta viết cho một người bạn thì tập tin nào mà chúng tacần đưa?
Câu hỏi 3: Sau khi tạo ra được tập tin thực thi exe Có cần thiết giữ lại tập tin nguồn không?Câu hỏi 4: Nếu trình biên dịch C# đưa ra một trình soạn thảo, có phải nhất thiết phải sử dụng nó?Câu hỏi 5: Có thể không quan tâm đến những cảnh báo khi biên dịch mã nguồn?
Trang 8Câu hỏi 6: Hãy đưa ra 3 lý do tại sao ngôn ngữ C# là một ngôn ngữ lập trình tốt?Câu hỏi 7: IL và CLR viết tắt cho từ nào và ý nghĩa của nó?
Câu hỏi 8: Đưa ra các bước cơ bản trong chu trình xây dựng chương trình?
Trang 9CHƯƠNG 2 Lập trình C# căn bản
Ngay sau khi khởi động Visual Studio, chọn Menu File New Project New Project New Project
Sau khi chọn vào Project, Visual Studio hiển thị giao diẹ ̂n để người dùng chọn dạngProject ở mục Project types và Templates, đặt tên cho Project ở mục Name và đặt đường dẫn choProject ở mục Location
Hình 1.1: Cấu hình Console Application project
Trang 10Để thực hiện debug, người lập trình có thể bấm F5 hoặc chọn vào Menu Debug / StartDebug.
b) Chế độ non-debug
Chế độ non-debug là chế độ chạy hết cả chương trình mà không dừng lại để bắt lỗi cho
dù người lập trình đã thiết lập breakpoint Để chạy chế đọ ̂ này, người lập trình có thể bấmCtrl+F5 hoặc chọn vào Menu Debug / Start Without Debugging
2.2 Biến và phạm vi hoạt động của biến trong C#
2.2.1 Biến
Biến là đơn vị được các ngôn ngữ lập trình tổ chức để lưu trữ và xử lý dữ liệu Biến đượckhai báo theo cú pháp sau
[modifier] datatype identifier;
[modifier] là một trong những từ khóa public, private, protected, ; datatype là kiểu dữ liệu; identifier là biến được người dùng định nghĩa;
2.2.2 Phạm vi hoạt động của biến
Trong C#, phạm vi hoạt động của biến là vùng đoạn mã mà từ đấy biến có thể được truyxuất Thông thường một đoạn mã được định nghĩa bằng một cặp dấu {} Trong một phạm vi hoạtđộng (scope), không thể có hai biến cùng mang một tên trùng nhau
2.3 Hằng
Một hằng (constant) là một biến nhưng trị không thể thay đổi được suốt thời gian thi hành
chương trình Đôi lúc ta cũng cần có những giá trị bao giờ cũng bất biến
Hằng được khai báo như sau:
const datatype identifier = value;
Ví dụ: const int numberOfModules = 12;
Hằng có những đặc điểm sau:
Trang 11 Hằng bắt buộc phải được gán giá trị lúc khai báo Một khi đã được khởi gán thì không thểviết đè lên
Trị của hằng phải có thể được tính toán vào lúc biên dịch, do đó không thể gán một hằngtừ một trị của một biến
Hằng bao giờ cũng static, tuy nhiên ta không thể đu ̛a từ khoá static vào khi khai báohằng
2.4 Kiểu dữ liệu
Ngôn ngữ C# đưa ra các kiểu dữ liệu xây dựng sẵn rất hữu dụng, phù hợp với một ngônngữ lập trình hiện đại, mỗi kiểu dữ liệu được ánh xạ đến một kiểu dữ liệu được hỗ trợ bởi hẹ ̂thống xác nhận ngôn ngữ chung (Common Language Specification: CLS) trong MS.NET Việcánh xạ các kiểu dữ liệu nguyên thuỷ của C# đến các kiểu dữ liệu của NET sẽ đảm bảo các đốitượng được tạo ra trong C# có thể được sử dụng đồng thời với các đối tượng được tạo bởi bất cứngôn ngữ khác được biên dịch bởi NET, như VB.NET
Mỗi kiểu dữ liệu có một sự xác nhận và kích thước không thay đổi, không giống như C++, int trong C# luôn có kích thước là 4 byte bởi vì nó được ánh xạ từ kiểu Int32 trong NET
Bảng 2.1: Các kiểu dữ liệu dựng sẵn
Kiểu C# Số byte Kiểu Net Mô tả
byte 1 Byte Số nguyên dương không dấu từ 0-255
bool 1 Boolean Giá trị logic true/ false
sbyte 1 Sbyte Số nguyên có dấu ( từ -128 đến 127)
short 2 Int16 Số nguyên có dấu giá trị từ -32768 đến 32767
ushort 2 Uint16 Số nguyên không dấu 0 – 65.535
int 4 Int32 Số nguyên có dấu –2.147.483.647 và 2.147.483.647
uint 4 Uint32 Số nguyên không dấu 0 – 4.294.967.295
float 4 Single Kiểu dấu chấm động, giá trị xấp xỉ từ 3,4E- 38 đến 3,4E+38,
với 7 chữ số có nghĩa
double 8 Double Kiểu dấu chấm động có độ chính xác gấp đôi, giá trị xấp xỉ
từ 1,7E-308 đến 1,7E+308, với 15,16 chữ số có nghĩa
decimal 8 Decimal Có độ chính xác đến 28 con số và giá trị thập phân, được
dùng trong tính toán tài chính, kiểu này đòi hỏi phải có hậu
tố “m” hay “M” theo sau giá trị
long 8 Int64 Kiểu số nguyên có dấu có giá trị trong khoảng:
-9.223.370.036.854.775.808 đến 9.223.372.036.854.775.807ulong 8 Uint64 Số nguyên không dấu từ 0 đến 0xffffffffffffffff
Trang 122.5 Cấu trúc điều kiện
2.5.1 Câu lệnh điều kiện if else
Console.WriteLine(“i is not Zero”); }
else { Console.WriteLine(“i is Zero”); }
default được sử dụng để giải quyết tru ̛ờng hợp của điều kiện mà trường hợp này không nằm
trong tất cả các trường hợp đã liệt kê trong các chỉ dẫn case.
Trang 13Cấu trúc while thực hiện việc lặp một hay nhiều lệnh khi điều kiện condition vẫn còn
đúng Khi sử dụng cấu trúc này, người lập trình cần phải chủ động thực hiện các câu lệnh tạo sựbiến đổi để tránh những vòng lặp vô tận
Cấu trúc lặp do while thực hiện việc lặp một hoặc nhiều lệnh cho tới khi điều kiện
condition có giá trị false Cấu trúc lặp này có đặc điểm là các lệnh được thực hiện ít nhất một lần
cho dù ngay từ đầu điều kiện đã là false.
2.7 Mảng
Mảng hay còn gọi là Array là một cấu trúc dữ liệu cấu tạo bởi một số biến được gọi lànhững phần tử mảng Tất cả các phần tử này đều thuọ ̂c một kiểu dữ liệu Người lập trình có thểtruy xuất phần tử thông qua chỉ số (index) Chỉ số bắt đầu bằng zero
Người ta thường chia mảng thành 2 loại: Mảng một chiều và mảng nhiều chiều Đối vớimảng nhiều chiều giáo trình này chỉ trình bày mảng hai chiều bởi vì mảng hai chiều là đặc trưngtiêu biểu cho mảng nhiều chiều
2.7.1 Mảng một chiều
a) Cú pháp
type[ ] array-name;
hoặc type[] array-name = new type[length];
Với cú pháp trên, type là kiểu dữ liệu của các phần tử trong mảng, array-name là tên của mảng, length là độ dài của mảng – độ dài này chính là số phần tử của mảng.
b) Cách sử dụng
Để làm việc với mảng, người lập trình thường can thiệp trực tiếp vào từng phần tử của
mảng thông qua chỉ số index với cú pháp array-name[index] Ví dụ:
x = A[0]; st = B[i]; B[1] = x;
2.7.2 Mảng hai chiều
a) Cú pháp
type[,] array-name;
Trang 14hoặc type[,] array-name = new type[height, width];
Với cú pháp trên, type là kiểu dữ liệu của các phần tử trong mảng, array-name là tên của mảng,height và width lần lượt là số dòng và số cột của ma trận
Ví dụ:
int[,] myRectArray = new int[2,3]; //khai báo mảng số nguyên có 2 dòng và 3 cột
int[,] myRectArray = new int[,]{ {1,2},{3,4},{5,6},{7,8}}; //khai báo mảng 4 hàng 2 cột
b) Cách sử dụng
Để làm việc với mảng hai chiều, người lập trình có thể can thiệp trực tiếp vào từng phầntử của mảng thông qua chỉ số hàng và chỉ số cọ ̂t Vì cấu trúc lưu trữ của ma trận bao gồm cáchàng và các cột nên người lập trình thường sử dụng hai vòng lặp lồng nhau để thực hiện việcduyệt cả ma trận
C) TÀI LIỆU HỌC TẬP
1 Phương Lan, Lập trình Windows với C#.Net, Nhà xuất bản Lao động – Xã hội
2 Phạm Hữu Khang, Đoàn Thiện Ngân, C# 2005 Tập 1, 2, 3, 4, 5, Nhà xuất bản Laođộng - Xã
hội
D) CÂU HỎI, BÀI TẬP, NỘI DUNG ÔN TẬP VÀ THẢO LUẬN
Bài tập 1: Viết chương trình giải phương trình bậc nhất, cho phép người dùng nhập vào giá trị a,b
Bài tập 2: Viết chương trình giải phương trình bậc hai, cho phép người dùng nhập vào giá trị a, b,c
Bài tập 3: Viết chương trình tính chu vi và diện tích của các hình sau: đường tròn, hình chữ nhật,hình thang, tam giác
Bài tập 4: Viết chương trình in ký tự số (0 9) và ký tự chữ (a z) với mã ký tự tu ̛ơng ứng củatừng ký tự
Bài tập 5: Tìm lỗi của chương trình sau Sửa lỗi và biên dịch lại chương trình
class BaiTap {
static void Main() {
int value;if (value > 100);
System.Console.WriteLine(“Number is greater than 100”);
}
}
Trang 15CHƯƠNG 3 Lập trình hướng đối tượng trong C#
Trong C#, tất cả các lớp được dẫn xuất từ lớp cơ sở System.Object Mỗi lớp thường đượcđịnh nghĩa trong một file cs và file này được thêm vào project Cũng giống như các ngôn ngữC++ và Java, C# cung cấp con trỏ this dùng để tham chiếu đến một thể hiện (instance) của classđang xét
Để định nghĩa một kiểu dữ liệu mới hay một lớp đầu tiên phải khai báo rồi sau đó mớiđịnh nghĩa các thuộc tính và phương thức của kiểu dữ liệu đó Khai báo một lớp bằng cách sử
dụng từ khoá class
Cú pháp đầy đủ của khai báo một lớp như sau:
[Thuộc tính] [Bổ sung truy cập] class <Định danh lớp> [: Lớp cơ sở] {
<Phần thân của lớp: bao gồm định nghĩa các thuộc tính và phương thức hành động > }
Ví dụ:
using System;
public class ThoiGian{
public void ThoiGianHienHanh() {
Console.WriteLine(“Hien thi thoi gian hien hanh”);
}
Trang 16// Các biến thành viên int Nam;int Thang;int Ngay;
int Gio;
int Phut;
int Giay;
} public class Tester {
static void Main() {
ThoiGian t = new ThoiGian();
t.ThoiGianHienHanh(); } }
Trong lớp có một phương thức mặc định dùng để khởi tạo đối tượng được gọi là phươngthức khởi tạo (constructor) Phương thức khởi tạo được được đặt tên trùng với tên lớp và có chỉdẫn truy cập bắt buộc là public để phương thức này có thể được triệu gọi từ bên ngoài phương
thức Các chỉ dẫn biên dịch (accessibility) bao gồm: public, internal, protected, private được mô
tả chi tiết theo bảng sau:
Bảng 3.1: Mô tả các chỉ dẫn truy cập trong C#
Chỉ dẫn truy cập Mô tả
public Biến và phương thức có thể được truy cập từ bất kỳ nơi
đâu (bên ngoài cũng như bên trong lớp)
internal Biến và phương thức chỉ có thể đu ̛ợc truy cập trong
cùng một gói
protected Biến và phương thức chỉ được truy cập ngay trong lớp
đó hoặc được được truy cập từ trong lớp kế thừa của nó
private Biến và phương thức chỉ được truy cập ngay trong phạm
vi của lớp đó
3.2 Đối tượng
Đối tượng là khái niệm dùng để chỉ một trường hợp cụ thể (instance) của một lớp Tronglập trình hướng, đối tượng là thực thể cơ bản của việc lập trình, các ứng xử và hành vi của đốitượng được chương trình triệu gọi thông qua các phương thức đã được mô tả ở lớp thuọ ̂c đốitượng đó Cũng giống như các lớp trong C#, tất cả các đối tượng cũng được kế thừa từ đối tượngcơ sở System.Object
Sử dụng từ khoá new để tạo một đối tượng:
[Tên lớp] [Tên đối tượng] = new [Tên lớp];
Ví dụ:
Thoigian tg = new Thoigian();
Trang 173.3 Thuộc tính
Thuộc tính là khái niệm dùng để chỉ các tính chất đặc trưng của một lớp Trong một lớp,các thuộc tính được mô tả một cách định tính bao gồm tên thuộc tính, kiểu dữ liệu và chỉ dẫntruy cập Trong một đối tượng, các thuộc tính được thể hiện một cách định lượng với việc các
thuộc tính được cung cấp một giá trị xác định (giá trị mặc định là null nếu như thuộc tính chưa
cung cấp giá trị)
C# cung cấp thủ tục get và set để thực hiện việc truy cập một thuộc tính, thủ tục get để lấy giá trị và thủ tục set để thực hiện việc thay đổi giá trị.
Static method là phương thức đặc trưng cho tất cả các đối tượng thuộc lớp đó Phươngthức này không thể được gọi từ đối tượng mà phải được gọi trực tiếp từ lớp Kết quả chạyphương thức này không phụ thuộc vào đối tượng mà phụ thuộc vào tham số đầu vào củaphương thức
3.5 Nạp chồng toán tử
Nạp chồng toán tử là khái niệm dùng để chỉ việc định nghĩa lại một số toàn tử mà nhữngtoán tử này làm việc với dữ liệu là đối tượng thuộc lớp mà người lập trình đang xây dựng Toántử có tính đồng nhất đối với tất cả các đối tượng thuộc lớp hoặc đối với tất cả các giá trị thuộc
kiểu dữ liệu do đó C# yêu cầu tất cả các toán tử phải là static method với chỉ dẫn truy cập là
public Trong C#, tất cả các lớp đều dẫn xuất từ lớp co ̛ sở System.Object và lớp này vốn định
nghĩa sẵn phương thức equal và toán tử gán (=) do đó người lập trình không cần thiết phải định
nghĩa lại toán tử gán
Ví dụ sau đây trình bày việc nạp chồng toán tử cộng (+) đối với đối tượng thuộc lớp phân
số (Fraction):
class Fraction {
public int numerator;
public int denominator;
public Fraction(int numer, int denom){
this.numerator = numer;
this.denominator = denom;
}
public static Fraction operator +(Fraction f1, Fraction f2) {
Fraction result = new Fraction(0 , 0);
if(f1.denominator != f2.denominator) {
Trang 18result.denominator = f1.denominator * f2.denominator;
result.numerator = f1.numerator * f2.denominator + f1.denominator *
}}
3.6 Kế thừa
Kế thừa là khái niệm then chốt của các ngôn ngữ lập trình hướng đối tượng dùng để hiểu
hiện tượng một lớp thực hiện việc sử dụng lại một số thuộc tính (attribute) hoặc phương thức (method) của một lớp khác Lớp sử dụng các thuộc tính và phương thức của lớp khác được gọi là
lớp dẫn xuất, đôi khi còn được gọi là lớp con Lớp cho phép lớp khác sử dụng các thuộc tính vàphương thức được gọi là lớp cơ sở, đôi khi còn được gọi là lớp cha
Kế thừa trong hướng đối tượng được chia thành hai loại: đơn kế thừa (single inheritance)
và đa kế thừa (multiple inheritance) Đơn kế thừa được hiểu là một lớp dẫn xuất sử dụng các
thuộc tính và phương thức của một lớp cơ sở duy nhất Ngược lại, nếu một lớp sử dụng các thuộctính và phương thức từ nhiều lớp sở sở thì được gọi là đa kế thừa
C++ hỗ trợ cả đo ̛n kế thừa và đa kế thừa, tuy nhiên C# chỉ hỗ trợ đo ̛n kế thừa Việc sửdụng đa kế thừa một cách hợp lý sẽ giúp cho chương trình tối ưu hơn về mặt kích thước nhưngviệc xử lý lỗi (nếu có) sẽ vô cùng phức tạp Đây là lý do co ̛ bản mà C# chỉ thiết kế cho đơn kếthừa
Cú pháp: class [Tên lớp được kế thừa] : [Lớp kế thừa]
Ví dụ sau đây xây dựng một lớp cơ sở và hai lớp kế thừa:
class Dog{
public string name;
public int weight;
Trang 19thì các ứng xử (hoặc kết quả thu được) của chương trình là giống nhau Tuy nhiên khi gọi
phương thức cụ thể từ lớp dẫn xuất – phu ̛ơng thức OnGuard() đối với Simon và phương thức
Chew() đối với Daisy – thì kết quả thu được khác nhau.
static void Main(string[] args)
{
Trang 20GermanShepard simon = new GermanShepard("Simon",3);
JackRussell daisy = new JackRussell("Daisy",2);
1 Phương Lan, Lập trình Windows với C#.Net, Nhà xuất bản Lao động – Xã hội
2 Phạm Hữu Khang, Đoàn Thiện Ngân, C# 2005 Tập 1, 2, 3, 4, 5, Nhà xuất bản Laođộng - Xã
hội
D) CÂU HỎI, BÀI TẬP, NỘI DUNG ÔN TẬP VÀ THẢO LUẬN
Bài tập 1: Xây dựng một lớp đường tròn lưu giữ bán kính và tâm của đu ̛ờng tròn Tạo cácphương thức để tính chu vi, diện tích của đường tròn
Bài tập 2: Thêm thuộc tính BanKinh vào lớp được tạo ra từ bài tập 1
Bài tập 3: Tạo ra một lớp lưu trữ giá trị nguyên tên myNumber Tạo thuọ ̂c tính cho thành viênnày Khi số được lưu trữ thì nhân cho 100 Và khi số được truy cập thì chia cho 100
Bài tập 4: Viết lớp giải phương trình bậc hai Lớp này có các thuộc tính a, b, c và nghiệm x1, x2.Hãy xây dựng theo hướng đối tượng lớp trên Lớp cho phép bên ngoài xem được các nghiệm củaphương trình và cho phép thiết lập hay xem các giá trị a, b, c
Bài tập 5: Chương trình sau có lỗi Hãy sửa lỗi của chương trình và biên dịch chương trình Dònglệnh nào gây ra lỗi?