TRƯỜNG ĐẠI HỌC PHẠM VĂN ĐỒNG
KHOA CÔNG NGHỆ THÔNG TIN
NGUYỄN VĂN TOÁN
BÀI GIẢNG
LẬP TRÌNH C#
Quảng Ngãi, 2018
TRƯỜNG ĐẠI HỌC PHẠM VĂN ĐỒNG
KHOA CÔNG NGHỆ THÔNG TIN
NGUYỄN VĂN TOÁN
BÀI GIẢNG
LẬP TRÌNH C#
(DÙNG CHO SINH VIÊN BẬC ĐẠI HỌC
NGÀNH CÔNG NGHỆ THÔNG TIN VÀ SƯ PHẠM TIN HỌC)
LƯU HÀNH NỘI BỘ
LỜI NÓI ĐẦU
Lập trình C# là môn học tìm hiểu các kiến thức cơ
bản về lập trình xây dựng ứng dụng bằng ngôn ngữ lập
trình C#. Nội dung cơ bản của môn học này giới thiệu các
kiến thức cơ bản của C#, hướng đối tượng trong C#, các
điều khiển hỗ trợ thiết kế giao diện và các điều khiển hỗ trợ
truy cập CSDL, in kết quả.
Bài giảng được biên soạn và giảng dạy cho sinh viên
ngành Công nghệ thông tin với sinh viên đã có kiến thức cơ
bản về lập trình, lập trình hướng đối tượng, hệ quản trị cơ
sở dữ liệu Microsoft SQL Server. Vì thế, những nội dung liên
quan đến các phần kiến thức này trong bài giảng chủ yếu là
tóm tắt, nhắc lại.
Ngôn ngữ C# hiện đang được cập nhật thường
xuyên. Qua mỗi phiên bản, mẫu lập trình được thay đổi
theo hướng tiện lợi hơn và các công nghệ mới, hiện đại
được bổ sung vào. Hiện nay, phạm vi kiến thức của ngôn
ngữ C# rất rộng. Nội dung kiến thức được trình bày trong
bài giảng này chỉ mới đề cập ngang phiên bản .NET
Framework 2.0. Mong rằng, qua bài giảng này, sinh viên có
thể nắm bắt được những vấn đề cốt lõi của ngôn ngữ lập
trình C# để làm cơ sở cho việc nghiên cứu sâu hơn về ngôn
ngữ lập trình này.
Bài giảng không sao tránh khỏi những thiếu sót.
Mong các thầy cô và các bạn sinh viên đóng góp ý kiến để
hoàn thiện hơn trong những lần chỉnh sửa sau.
Xin chân thành cảm ơn.
Quảng Ngãi, tháng 11 năm 2018
Nguyễn Văn Toán
i
MỤC LỤC
Chương 1: Giới thiệu Microsoft .NET, cơ sở của ngôn ngữ C# .................... 1
1.1. Tổng quan Microsoft .NET ................................................................. 1
1.1.1. Kiến trúc .NET framework ..................................................... 1
1.1.2. Biên dịch và ngôn ngữ trung gian .......................................... 3
1.2. Giới thiệu ngôn ngữ C# ...................................................................... 4
1.2.1. Chương trình đầu tiên ............................................................. 4
1.2.2. Kiểu dữ liệu, biểu thức, câu lệnh ............................................ 6
1.2.3. Chú thích ............................................................................... 12
1.2.4. Các cấu trúc dữ liệu .............................................................. 13
1.3. Câu hỏi và bài tập ............................................................................. 16
1.4. Bài mẫu ............................................................................................. 17
Chương 2: Hướng đối tượng trong C# ........................................................... 20
2.1. Lớp, đối tượng................................................................................... 20
2.1.1. Các thành phần của lớp......................................................... 21
2.1.2. Phạm vi truy cập của lớp ...................................................... 21
2.1.3. Ví dụ về lớp .......................................................................... 22
2.2. Không gian tên, lệnh using ............................................................... 24
2.2.1. Không gian tên ...................................................................... 24
2.2.2. Lệnh using ............................................................................ 25
2.2.3. Bí danh của không gian tên .................................................. 25
2.3. Quản lý ngoại lệ ................................................................................ 26
2.3.1. Cấu trúc của một ngoại lệ ..................................................... 26
2.3.2. Ném ngoại lệ ......................................................................... 27
2.3.3. Bắt ngoại lệ ........................................................................... 27
2.4. Một số lớp thông dụng ...................................................................... 29
2.4.1. List ........................................................................................ 29
2.4.2. String..................................................................................... 30
2.4.3. StreamReader, StreamWriter ................................................ 31
2.5. Câu hỏi và bài tập ............................................................................. 33
2.6. Bài mẫu ............................................................................................. 34
ii
Chương 3: Ứng dụng Windows trong C# ...................................................... 39
3.1. Giao diện ứng dụng và các điều khiển thông dụng .......................... 39
3.1.1. Giao diện ứng dụng .............................................................. 39
3.1.2. Các điều khiển thông dụng trên Form .................................. 43
3.2. Một số hộp thoại thông dụng ............................................................ 46
3.2.1. MessageBox .......................................................................... 46
3.2.2. OpenDialog ........................................................................... 47
3.3. Menu, ToolStrip ................................................................................ 47
3.3.1. Menu ..................................................................................... 47
3.3.2. ToolStrip ............................................................................... 47
3.4. Câu hỏi và bài tập ............................................................................. 48
3.5. Bài mẫu ............................................................................................. 49
Chương 4: Quản lý dữ liệu với Microsoft SQL Server ................................ 56
4.1. Các khái niệm về cơ sở dữ liệu trong MS SQL Server .................... 56
4.1.1. Các khái niệm về cơ sở dữ liệu............................................. 56
4.1.2. Khái niệm về cơ sở dữ liệu trong MS SQL Server .............. 57
4.2. Ngôn ngữ SQL .................................................................................. 57
4.2.1. Các câu lệnh SQL ................................................................. 58
4.2.2. Kiểu dữ liệu .......................................................................... 58
4.2.3. Toán tử .................................................................................. 60
4.2.4. Một số hàm thường dùng ...................................................... 61
4.2.5. Các câu lệnh SQL thường dùng............................................ 62
4.3. Câu hỏi và bài tập ............................................................................. 65
4.4. Bài mẫu ............................................................................................. 65
Chương 5: Truy cập cơ sở dữ liệu với ADO.NET......................................... 67
5.1. Mô hình kết nối và truy cập dữ liệu với ADO.NET ......................... 67
5.1.1. Mô hình kết nối và truy cập dữ liệu tổng quát ..................... 67
5.1.2. Connection ............................................................................ 68
5.1.3. Kết nối đến cơ sở dữ liệu ...................................................... 69
5.1.4. Transaction ........................................................................... 70
5.2. Mô hình truy cập dữ liệu với Command ........................................... 71
5.2.1. Command .............................................................................. 71
iii
5.2.2. DataReader ........................................................................... 72
5.3. Mô hình truy cập dữ liệu nâng cao với cơ sở dữ liệu ảo .................. 73
5.3.1. DataSet .................................................................................. 73
5.3.2. DataAdapter .......................................................................... 74
5.4. Buộc dữ liệu ...................................................................................... 75
5.4.1. Mô hình truy cập và hiển thị dữ liệu .................................... 75
5.4.2. Buộc dữ liệu .......................................................................... 76
5.5. Câu hỏi và bài tập ............................................................................. 77
5.6. Bài mẫu ............................................................................................. 78
Chương 6: Report và đóng gói ứng dụng....................................................... 90
6.1. Report ................................................................................................ 90
6.1.1. Tổng quan về Report ............................................................ 90
6.1.2. Tiến trình xây dựng Report .................................................. 91
6.1.3. Các công cụ hỗ trợ tạo Report .............................................. 91
6.2. Đóng gói ứng dụng ........................................................................... 96
6.2.1. Lợi ích ................................................................................... 96
6.2.2. Các thành phần đưa vào gói ứng dụng ................................. 96
6.2.3. Setup Project ......................................................................... 97
6.3. Câu hỏi và bài tập ............................................................................. 97
6.4. Bài mẫu ............................................................................................. 98
TÀI LIỆU THAM KHẢO .............................................................................. 103
iv
Chương 1:
Giới thiệu Microsoft .NET, cơ sở của ngôn ngữ C#
Thời lượng: 8 tiết
Mục tiêu:
- Biết được tổng quan về Microsoft .NET, kiến trúc .NET Framework,
- Hiểu được các thành phần cơ bản của C#,
- Viết được các chương trình đơn giản bằng C#.
1.1. Tổng quan Microsoft .NET
Nền tảng Microsoft .NET (.NET) cung cấp tất cả các công cụ và kỹ thuật
cần thiết để người dùng có thể xây dựng một ứng dụng trên môi trường internet.
Trong chương trình học, nền tảng .NET được mô tả đơn giản như Hình 1-1.
Trung tâm của .NET là .NET framework và môi trường phát triển (IDE Integrated Development Environment). Framework cung cấp những gì cần thiết,
căn bản (hạ tầng cơ sở) theo một quy ước nhất định để giúp cho việc phát triển
ứng dụng. IDE là môi trường giúp việc phát triển ứng dụng trở nên dễ dàng và
nhanh chóng. Nếu không có IDE, chúng ta cũng có thể phát triển được ứng dụng
trên .NET. Tuy nhiên, việc này rất mất thời gian. Chúng ta nên sử dụng một IDE
nào đó để phát triển ứng dụng.
C++
C#
J#
…
.NET Framework
(IDE)
Common Language Specification
Visual Studio .NET
Visual
Basic
Hình 1-1 Mô tả đơn giản nền tảng .NET
1.1.1. Kiến trúc .NET framework
.NET framework gồm 2 thành phần chính: khối thực thi ngôn ngữ nền
Trang 1
tảng (CLR - Common Language Runtime) và thư viện lớp (FCL - Framework
Class Library). CLR là nền tảng của .NET framework. CLR quản lý sự thực thi
mã lệnh và các quản lý liên quan: biên dịch, quản lý bộ nhớ, quản lý thực hiện
tiểu trình, bảo mật,… Mã lệnh được thực thi trong CLR là mã lệnh được quản lý
(managed code), khác với mã lệnh không được quản lý như COM, các thành
phần dựa trên Windows API. FCL là thư viện kiểu dữ liệu (gồm các class, struct,
enum,…) dành cho ứng dụng thực thi trong .NET. Tất cả các ngôn ngữ hỗ trợ
.NET framework đều sử dụng thư viện lớp dùng chung này.
Các thành phần trong CLR:
Thành phần
Mô tả
Class Loader
Quản lý siêu dữ liệu, khởi tạo và trình bày các lớp
MSIL to Native Compilers
Chuyển từ MSIL sang mã nhị phân
Code Manager
Quản lý việc thực thi
Garbage Collector
Dọn rác tự động
Security Engine
Bảo mật
Debug Engine
Phát hiện lỗi
Type Checker
Kiểm tra kiểu
Exception Manager
Quản lý ngoại lệ
Thread Support
Hỗ trợ các lớp, giao diện cho lập trình đa luồng
COM Marshaler
Chuyển đổi thành phần COM
Base Class Library Support Hỗ trợ thư viện các lớp cơ sở
Thư viện các lớp cơ sở trong CFL:
Mô tả
System.
Không gian tên
Collections
Danh sách (mảng) động
Configuration
Cấu hình
IO
Vào/ra dữ liệu
Net
Kết nối mạng
Trang 2
Reflection
Phản chiếu (dịch ngược)
Resources
Tài nguyên (file, chuỗi, hình ảnh)
Security
Bảo mật
Text
Chuỗi
Threading
Đa luồng
Runtime
Thực thi thời gian thực
1.1.2. Biên dịch và ngôn ngữ trung gian
a) Các bước thực hiện của chương trình truyền thống:
Các ngôn ngữ trước đây (Pascal, C, C++, Visual Basic) có chương trình
dịch và và môi trường thực thi của riêng nó và một chương trình chỉ cần dịch
một lần để thực thi.
Các bước thực hiện của một chương trình truyền thống như Hình 1-2:
- Bước 1: biên dịch mã nguồn thành mã có thể thực thi.
- Bước 2: Thực thi thời gian thực mã có thể thực thi.
Mã
nguồn
Biên dịch
Mã có thể
thực thi
Thực thi
Mã nhị
phân
Hình 1-2 Các bước thực thi một chương trình truyền thống
b) Các bước thực hiện của chương trình .NET:
.NET có chương trình dịch và môi trường thực thi cho mọi máy tính đã
cài đặt .NET Framework. Một chương trình trong .NET phải được dịch hai lần
trước khi được thực thi.
Quá trình biên dịch trong .NET được thực hiện qua 2 giai giai đoạn như
Hình 1-3:
Giai đoạn 1: biên dịch mã nguồn
Bước 1: biên dịch mã nguồn thành mã MSIL (Microsoft Intermediate
Language) và siêu dữ liệu.
Giai đoạn 2: biên dịch mã MSIL
Trang 3
Bước 2: từ siêu dữ liệu, CLR biên dịch mã MSIL thành mã có thể thực thi
được và thực thi thời gian thực.
Mã
nguồn
MSIL
Biên dịch
+
Siêu dữ liệu
Sử dụng CLR
Thực thi
Mã nhị
phân
Biên dịch lần 2
Biên dịch lần 1
Hình 1-3 Quá trình biên dịch một chương trình .NET
Các chương trình .NET được biên dịch 2 lần. Kết quả biên dịch của lần
thứ nhất chỉ ở dạng mã MSIL. Kết quả biên dịch lần thứ hai sẽ là mã máy.
Khi thực thi một chương trình .NET thì thường lần đầu chậm và lần thứ 2
sẽ tương đối nhanh. Khi thực thi lần đầu, chương trình phải được dịch sang mã
nhị phân và khi thực hiện phải lưu vào bộ nhớ cache. Điều này làm cho quá trình
thực hiện bị chậm. Khi thực hiện lần thứ hai, chương trình không cần phải dịch
lại và dữ liệu đã có trong bộ nhớ cache nên việc thực hiện tương đối nhanh.
1.2. Giới thiệu ngôn ngữ C#
Có nhiều ngôn ngữ có thể sử dụng để xây dựng ứng dụng trên môi trường
.NET. Tuy nhiên, C# là một ngôn ngữ lập trình đặc biệt, được thiết kế để xây
dựng ứng dụng trên môi trường này.
C# là một ngôn ngữ lập trình đơn giản, hiện đại, an toàn và hướng đối
tượng. Nó là ngôn ngữ mạnh nhất trong .NET, thay thế cho C++ và việc sử dụng
con trỏ dễ dàng hơn C++.
Trong C#, một bài toán là một vấn đề cần được giải quyết (Problem) và
tập hợp những gì ta làm bằng C# để giải quyết vấn đề nào đó là một giải pháp
(Solution). Để có được một giải pháp thì cần nhiều dự án (Project) cho nên giải
pháp trong C# thường có một hoặc nhiều dự án. Dự án trong C# có thể là một
chương trình đơn giản hoặc một thư viện hoặc một bộ cài đặt…
1.2.1. Chương trình đầu tiên
a) Không sử dụng IDE:
- Sử dụng Notepad tạo và lưu lại với tên file là ChaoMung.CS trong ổ đĩa
D:\ với nội dung sau:
Trang 4
class ChaoMung
{
static void Main()
{
System.Console.Write(“Hello, World”);
System.Console.ReadKey();
}
}
- Khởi động Visual Studio Command Prompt: Start > Programs >
Microsfoft Visual Studio > Visual Studio Tools > Visual Studio Command
Prompt.
- Gõ lệnh sau để biên dịch file ChaoMung.CS.
D:\> csc /t:exe /out:chaomung.exe ChaoMung.CS
- Sau khi biên dịch thành công, thực thi file chaomung.exe ta được kết
quả:
D:\> chaomung.exe
Hello, World
Hình 1-4 Giao diện khởi động Microsoft Visual Studio 2008
Trang 5
b) Sử dụng IDE:
- Khởi động Microsoft Visual Studio:
Lưu ý: nếu là trường hợp khởi động IDE lần tiên sau khi cài thì chương
trình yêu cầu lựa chọn môi trường lập trình mặc định. Trong trường hợp này ta
nên chọn C#. Khi khởi động, chương trình có giao diện như Hình 1-4:
- Tạo mới dự án:
Chọn File > New > Project… để tạo một project mới. Giao diện tạo mới
một dự án như Hình 1-5:
Hình 1-5 Giao diện tạo dự án mới trên Microsoft Visual Studio 2008
- Thêm nội dung sau vào hàm Main:
Console.WriteLine("Hello, World");
Console.ReadKey();
- Nhấn phím F6 để biên dịch.
- Nhấn phím F5 để thực thi.
- Kết quả thực thi: Dòng chữ “Hello, World” được in ra màn hình.
1.2.2. Kiểu dữ liệu, biểu thức, câu lệnh
a) Kiểu dữ liệu:
C# có 2 loại kiểu dữ liệu: kiểu giá trị và kiểu tham chiếu. Các kiểu dữ liệu
của C# được mô tả ở bảng sau:
Trang 6
Kiểu dữ liệu
Mô tả
Số nguyên có dấu: sbyte, short, int, long
Kiểu giá trị
Số nguyên không dấu: byte, ushort, uint,
ulong
Kiểu đơn giản
Ký tự Unicode: char
Số thực: float, double
Kiểu decimal: decimal
Kiểu logic: bool
Kiểu enum
enum E {...}
Kiểu struct
struct S {...}
Kiểu tham chiếu
Kiểu cơ sở của các kiểu khác: object
Kiểu class
Unicode: string
class C {...}
Kiểu interface
interface I {...}
Kiểu mảng
int[] and int[,]
Kiểu delegate
delegate T D(...)
Kiểu dữ liệu số của C# được mô tả ở bảng sau:
Danh mục kiểu Số bit
Có dấu
Không dấu
Số thực
Decimal
Kiểu
Phạm vi
8
sbyte
–128...127
16
short
–32,768...32,767
32
int
–2,147,483,648 ... 2,147,483,647
64
long
–9,223,372,036,854,775,808 ...
9,223,372,036,854,775,807
8
byte
0...255
16
ushort
0...65,535
32
uint
0...4,294,967,295
64
ulong
0...18,446,744,073,709,551,615
32
float
1.5 × 10−45 to 3.4 × 1038, 7-chữ số lẻ
64
double
5.0 × 10−324 to 1.7 × 10308, 15-chữ số lẻ
128
decimal 1.0 × 10−28 to 7.9 × 1028, 28-chữ số lẻ
Trang 7
b) Biểu thức:
Danh mục
Dành riêng
Phép một ngôi
Phép nhân
Phép thêm
Dịch bit
Phép so sánh
So sánh bằng
Biểu thức
Mô tả
x.m
Truy xuất thành viên
x(...)
Phương thức hoặc delegate
x[...]
Truy cập mảng hoặc chỉ mục
new T(...)
Tạo mới 1 đối tượng hoặc delegate
new T[...]
Tạo mới mảng
typeof(T)
Lấy kiểu dữ liệu
+x
Phép cộng
-x
Phép trừ
!x
Phép phủ định
~x
Phép đảo bit
++x, x++
Phép tăng 1
--x, x--
Phép giảm 1
(T)x
Ép (chuyển) kiểu
x * y
Phép nhân
x / y
Phép chia
x % y
Phép chia lấy dư
x + y
Phép cộng, nối chuỗi, thêm delegate
x – y
Phép trừ, loại bỏ delegate
x << y
Dịch trái
x >> y
Dịch phải
x < y
Bé hơn
x > y
Lớn hơn
x <= y
Bé hơn bằng
x >= y
Bé hơn bằng
x is T
trả về true nếu x là kiểu T, false
trong trường hợp ngược lại
x as T
Trả về x là kiểu T, hoặc null nếu x
không có kiểu là T
x == y
Bằng
Trang 8
x != y
Không bằng
Phép AND bit
x & y
AND 2 số nguyên hoặc 2 giá trị logic
Phép XOR bit
x ^ y
XOR 2 số nguyên hoặc 2 giá trị logic
Phép OR bit
x | y
OR 2 số nguyên hoặc 2 giá trị logic
Phép AND
x && y
Điều kiện AND
Phép OR
x || y
Điều kiện OR
Phép điều kiện
x ? y : z
Phép toán 3 ngôi
Phép gán
x = y
Phép gán
x op= y
Nối phép toán với phép gán. op có thể là:
*= /= %= += -= <<= >>= &=
^= |=
c) Câu lệnh:
Các câu lệnh trong C#:
Câu lệnh
Ví dụ
Khai báo biến
địa phương
static void Main() {
int a;
int b = 2, c = 3;
a = 1;
Console.WriteLine(a + b + c);
// In ra man hinh
}
Khai báo
hằng địa
phương
static void Main() {
const float pi = 3.1415927f;
const int r = 25;
Console.WriteLine(pi * r * r);
}
Các câu lệnh,
biểu thức
static void Main() {
int i;
i = 123;
Console.WriteLine(i);
i++;
Console.WriteLine(i);
}
Lệnh if
static void Main(string[] args) {
if (args.Length == 0) {
Console.WriteLine("Không đối số");
}
else {
Console.WriteLine("1 hoặc n đối số");
}
}
Lệnh switch
static void Main(string[] args) {
int n = args.Length;
switch (n) {
case 0:
Trang 9
}
Console.WriteLine("Không đs");
break;
case 1:
Console.WriteLine("1 đs");
break;
default:
Console.WriteLine("{0} đs", n);
break;
}
}
Lệnh while
static void Main(string[] args) {
int i = 0;
while (i < args.Length) {
Console.WriteLine(args[i]);
i++;
}
}
Lệnh do…
while
static void Main() {
string s;
do {
s = Console.ReadLine();
if (s != null) Console.WriteLine(s);
} while (s != null);
}
Lệnh for
static void Main(string[] args) {
for (int i = 0; i < args.Length; i++) {
Console.WriteLine(args[i]);
}
}
Lệnh foreach
static void Main(string[] args) {
foreach (string s in args) {
Console.WriteLine(s);
}
}
Lệnh break
static void Main() {
while (true) {
string s = Console.ReadLine();
if (s == null) break;
Console.WriteLine(s);
}
}
Lệnh continue static void Main(string[] args) {
for (int i = 0; i < args.Length; i++) {
if (args[i].StartsWith("/")) continue;
Console.WriteLine(args[i]);
}
}
Lệnh goto
static void Main(string[] args) {
int i = 0;
goto check;
loop:
Console.WriteLine(args[i++]);
check:
if (i < args.Length) goto loop;
}
Trang 10
Lệnh return
static int Add(int a, int b) {
return a + b;
}
static void Main() {
Console.WriteLine(Add(1, 2));
return;
}
Lệnh throw
and try
static double Divide(double x, double y) {
if (y == 0) throw new
DivideByZeroException();
return x / y;
}
static void Main(string[] args) {
try {
if (args.Length != 2) {
throw new Exception("Two numbers
required");
}
double x = double.Parse(args[0]);
double y = double.Parse(args[1]);
Console.WriteLine(Divide(x, y));
}
catch (Exception e) {
Console.WriteLine(e.Message);
}
}
Lệnh checked
và unchecked
static void Main() {
int i = int.MaxValue;
checked {
Console.WriteLine(i + 1);// Exception
}
unchecked {
Console.WriteLine(i + 1);// Overflow
}
}
Lệnh lock
class Account
{
decimal balance;
public void Withdraw(decimal amount) {
lock (this) {
if (amount > balance) {
throw new
Exception("Insufficient funds");
}
balance -= amount;
}
}
}
Lệnh using
static void Main() {
using (TextWriter w =
File.CreateText("test.txt"))
w.WriteLine("Line
w.WriteLine("Line
w.WriteLine("Line
}
}
Trang 11
{
one");
two");
three");
1.2.3. Chú thích
Chú thích là hình thức cho phép chèn thêm dòng chỉ dẫn, tài liệu vào
trong đoạn mã lệnh. Khi biên dịch, trình biên dịch sẽ bỏ qua các dòng được chú
thích. C# cho phép 3 kiểu chú thích sau:
Chú thích một dòng:
Sử dụng cặp “//” để chú thích một dòng. Chú thích có hiệu lực từ khi gặp
cắp dấu này cho đến hết dòng (gặp dấu kết thúc dòng).
Chú thích nhiều dòng:
Sử dụng hai cặp dấu “/*” và “*/” để chú thích nhiều dòng liên tiếp. Chú
thích có hiệu lực từ khi gặp cặp dấu “/*” cho đến khi gặp dấu “*/”.
Ví dụ dưới đây minh họa về chú thích một dòng và chú thích nhiều dòng:
// Day la chu thich mot dong
/* Day la chu thich nhieu dong lien tiep.
So dong co the rat nhieu.
So dong la 1 cung duoc.*/ Cau nay khong duoc chu thich.
Chú ý:
Ta có thể dùng nhiều chú thích một dòng để chú thích cho nhiều dòng và
dùng chú thích nhiều dòng để chú thích cho một dòng. Tuy nhiên, người ta
thường dùng:
- Chú thích một dòng cho mã lệnh tạm thời chưa dùng hoặc có thể sai.
Điều này làm cho giúp cho việc soạn thảo mã lệnh được nhanh chóng.
- Chú thích nhiều dòng cho tài liệu.
Chú thích tài liệu XML:
Sử dụng bộ dấu “///” để chèn tài liệu XML vào mã lệnh. Chú thích chỉ có
hiệu lực như chú thích một dòng. Tuy nhiên, C# có thể hiểu được các chú thích
này trên nhiều dòng được chú thích liên tiếp. Khi biên dịch, khi trình biên dịch
gặp chú thích này, trình biên dịch sẽ biên dịch vào Assembly.
Ví dụ dưới đây minh họa về chú thích tài liệu XML:
/// <summary> documentation here </summary>
Với dòng chú thích trên, chúng ta có thể hiểu đó là một thẻ XML. Cụ thể
ở đây là thẻ có tên là “summary” và có nội dung là “documentation here”.
Chú thích loại này thường được dùng để chú thích cho các lớp, phương
thức,… Tuy nhiên, chú thích này phải được đặt ngay trước mã lệnh tương ứng
với đối tượng cần chú thích.
Trang 12
1.2.4. Các cấu trúc dữ liệu
a) Mảng:
Mảng là kiểu được dùng để thể hiện một dãy các đối tượng có cùng kiểu
dữ liệu được đặt liên tiếp nhau trong bộ nhớ. Chúng ta dùng cặp dấu “[]” để khai
báo và truy xuất các phần tử của mảng.
Khi khai báo, chúng ta có thể dùng biến hay hằng để định nghĩa chiều dài
của mảng. Tuy nhiên, kích thước của mảng sẽ không thể thay đổi sau lệnh khai
báo.
Ví dụ dưới đây minh họa về khai báo mảng một chiều:
int[] integers = new int[15];
// Khai bao mang integers co kich thuoc la 15
int length = 20;
int[] list = new int[length];
list[0] = 2;
Chúng ta cũng có thể khai báo một mảng theo cách liệt kê.
Ví dụ minh họa về khai báo theo kiểu liệt kê:
int[] Mang = {3, 5, 7, 8};
Để đọc chiều dài của mảng hiện tại ta có thể sử dụng cú pháp:
mảng>.Length.
C# còn hỗ trợ các mảng nhiều chiều: kiểu ma trận, kiểu răng cưa.
Ví dụ dưới đây minh họa cách khai báo và khởi tạo một mảng nhiều chiều
kiểu ma trận hai chiều bằng cách sử dụng thêm dấu “,”:
String [ , ] A = { {"Lennon","John"},
{"McCartney","Paul"},
{"Harrison","George"},
{"Starkey","Richard"} };
Các phần tử của A có thể được hình dung như sau:
A
0
1
0
Lennon
John
1
McCartney
Paul
2
Harrison
George
3
Starkey
Richard
Trang 13
Như vậy A như là một ma trận 2 cột x 4 dòng. Phần tử đầu tiên là A[0,0]
có giá trị là “Lennon”, phần tử cuối cùng là A[3,1] có giá trị là “Richard”.
Tương tự, để khai báo mảng ba chiều ta có thể khai báo như sau:
String [ , , ] my3D_Array;
Kiểu mảng nhiều chiều thứ hai là mảng kiểu răng cưa, trong đó kích
thước của mỗi chiều là có thể khác nhau. Chính xác, đây là kiểu dữ liệu mảng
của các mảng. Đoạn mã lệnh dưới đây minh họa cách định nghĩa một mảng kiểu
răng cưa:
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[3];
a[2] = new int[1];
b) struct:
Kiểu dữ liệu struct là kiểu dữ liệu dung lượng hạn nhẹ (light-weight). Nó
thường được dùng trong trường hợp trình điều khiển dữ liệu chỉ cần một tập các
biến giá trị. Các struct tương tự như các class ở chỗ chúng đều có thể chứa các
hàm tạo, các phương thức, thậm chí là có thể xây dựng các giao diện. Tuy nhiên,
struct khác class ở các điểm chính:
- struct là kiểu giá trị còn class là kiểu tham chiếu. Điều này dẫn đến
chúng có cách dùng khác nhau khi là tham số được truyền cho các phương thức.
- struct không hỗ trợ kế thừa. Tuy nhiên, struct có thể tiết kiệm bộ nhớ
hơn so với class.
- struct luôn luôn có hàm tạo mặc định trong khi class có thể ẩn hạm tạo
bằng cách cài đặt phạm vị truy cập của của hàm tạo là private.
Sau đây là một ví dụ về cách dùng của struct:
using System;
struct Person
{
string name;
DateTime birthDate;
int heightInCm;
int weightInKg;
public Person(string name, DateTime birthDate, int
heightInCm, int
weightInKg)
Trang 14
{
this.name = name;
this.birthDate = birthDate;
this.heightInCm = heightInCm;
this.weightInKg = weightInKg;
}
}
public class StructWikiBookSample
{
public static void Main()
{
Person dana = new Person("Dana Developer", new
DateTime(1974, 7, 18),178, 50);
}
}
Kiểu struct vận hành hiệu quả nhất trong trường hợp dữ liệu có dung
lượng nhỏ hơn hoặc bằng 16 byte. Nếu dữ liệu có dung lượng lớn hơn nhiều thì
ta nên dùng kiểu class.
c) enum:
Kiểu enum là kiểu dữ liệu nguyên với mỗi giá trị được gán với một cái tên
định danh. Sử dụng enum sẽ giúp cho một tập các giá trị trở nên dễ gợi nhớ.
Nếu có 7 số nguyên tượng trưng cho các ngày trong tuần thì ta có thể sử
dụng enum gợi nhớ có khai báo như sau:
enum Weekday {Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday, Sunday};
Hay trường hợp có ba số 0, 1 và 2 tương ứng với ba buổi trong ngày thì ta
có thể gợi nhớ tập này bằng enum sau:
public enum TimeOfDay
{
Morning = 0,
Afternoon = 1,
Evening = 2
}
Việc sử dụng enum sẽ giúp cho đoạn mã lệnh của dễ quản lý, dễ hiểu hơn.
Trang 15
Kiểu enum cũng hỗ trợ chúng ta chuyển đổi giữa giá trị và chuỗi định
danh tương ứng. Sau đây là đoạn mã ví dụ.
//enum -> string
TimeOfDay time = TimeOfDay.Afternoon;
Console.WriteLine(time.ToString()); // chuoi in ra la
“Afternoon”
//string -> enum
TimeOfDay time2 = (TimeOfDay)
Enum.Parse(typeof(TimeOfDay), "Afternoon", true);
Console.WriteLine((int)time2);
1.3. Câu hỏi và bài tập
1) Cài đặt bộ Microsoft Visual Studio 2005 (2008, 2010) lên máy tính cá
nhân.
Lưu ý: chỉ cài đặt ngôn ngữ C#, không cần cài đặt các ngôn ngữ J#, C++,
Visual Basic,…
2) Hãy so sánh hai cách xây dựng ứng dụng: có sử dụng IDE và không sử
dụng IDE.
3) Theo quan điểm cá nhân của anh (chị), lợi ích của việc sử dụng .NET
Framework là gì?
4) Hãy nêu những đặc điểm mà anh (chị) thấy là khác nhau giữa C và C#.
5) Viết chương trình nhập vào chiều dài và chiều rộng của một hình chữ
nhật. In ra màn hình chu vi và diện tích của hình chữ nhật đó.
6) Viết chương trình nhập vào 4 số nguyên. In ra màn hình giá trị lớn
nhất.
7) Viết chương trình giải phương trình bậc nhất: bx +c =0 với các hệ số b,
c bất kỳ.
8) Viết chương trình giải phương trình bậc hai: ax2 + bx +c =0 với các hệ
số a, b, c bất kỳ.
9) Viết chương trình nhập vào một số nguyên dương. Chương trình kết
thúc khi nhận được một số nguyên dương.
10) Viết chương trình nhập vào một số nguyên dương n. Cho biết n có
phải là số nguyên tố không ?
11) Viết chương trình nhập vào một số nguyên dương n. In ra màn hình
các số nguyên tố bé hơn n.
Trang 16
12) Viết chương trình có 4 mục chọn. Mục chọn đầu tiên cho phép
dừng chương trình và 3 mục chọn tiếp theo sẽ thực hiện 3 trong các bài
tập 5-11.
1.4. Bài mẫu
Viết chương trình nhập vào danh sách sinh viên và in ra danh sách thông
tin sinh viên vừa nhập. Thông tin về sinh viên bao gồm: mã sinh viên, họ tên
sinh viên, ngày sinh, giới tính và mã lớp.
Bài làm mẫu:
using System;
namespace Sample
{
// struct thể hiện sinh viên
struct SinhVien
{
string masv, hotensv, malop;
DateTime ngaysinh;
bool gioitinh;
// Gán dữ liệu cho 1 sinh viên
public static SinhVien NhapSV(string masv, string
hotensv, string ngaysinh, string gioitinh, string malop)
{
SinhVien sv = new SinhVien();
sv.masv = masv;
sv.hotensv = hotensv;
sv.ngaysinh = DateTime.Parse(ngaysinh);
sv.gioitinh = gioitinh == "nam" ? true : false;
sv.malop = malop;
return sv;
}
// In 1 sinh viên thành 1 dòng dữ liệu
public static string InSV(SinhVien sv)
{
string chuoi = sv.malop + ", " + sv.hotensv + ", "
+ sv.ngaysinh.ToShortDateString() + ", ";
if (sv.gioitinh == true)
chuoi += "nam";
else
chuoi += "nu";
chuoi += ", " + sv.malop;
return chuoi;
}
}
class Program
Trang 17
{
// Khai báo biến của lớp
static SinhVien[] dssv = new SinhVien[100];
static int n;
// Nhập danh sách sinh viên từ bàn phím
static void NhapDSSV()
{
string soluong, masv, hotensv, ngaysinh, gioitinh,
malop;
int i;
Console.Clear();
Console.WriteLine("Chao mung ban den voi chuong
trinh");
Console.Write("Dau tien, ban hay nhap so luong
sinh vien, n = ");
soluong = Console.ReadLine();
n = int.Parse(soluong);
Console.WriteLine("Tiep theo, ban hay nhap thong
tin cho so sinh vien");
for (i = 0; i < n; i++)
{
Console.WriteLine("Nhap thong tin sinh vien
thu " + (i + 1));
Console.Write("- Ma sinh vien = ");
masv = Console.ReadLine();
Console.Write("- Ho ten sinh vien = ");
hotensv = Console.ReadLine();
Console.Write("- Ngay sinh cua sinh vien
(dd/mm/yyyy) = ");
ngaysinh = Console.ReadLine();
Console.Write("- Gioi tinh sinh vien (nam hoac
nu) = ");
gioitinh = Console.ReadLine();
Console.Write("- Ma lop sinh vien = ");
malop = Console.ReadLine();
dssv[i] = SinhVien.NhapSV(masv, hotensv,
ngaysinh, gioitinh, malop);
}
}
// In danh sách sinh viên ra màn hình Console
static void InDSSV()
{
Console.WriteLine("Danh sach sinh vien vua nhap
la:");
for(int i=0;i
Console.WriteLine((i+1)+".
"+SinhVien.InSV(dssv[i]));
}
Trang 18
}
// Chương trình chính
static void Main(string[] args)
{
NhapDSSV();
InDSSV();
Console.ReadKey();
}
}
}
Trang 19