Ngôn ngữ lập trình C#

1.Microsoft.NET. 10

Tình hình trước khiMS.NET ra đời . 10

Nguồn gốccủa .NET. 12

Microsoft.NET. 12

Tổngquan. 12

Kiến trúc .NETFramework. 13

CommonLanguageRuntime. 15

Thưviện .NET Framework. 16

Phát triển ứng dụngclient. 16

Biên dịch và MSIL. 17

Ngônngữ C#. 18

2.Ngôn ngữC#. 20

Tại sao phải sử dụng ngônngữ C#.20

C#là ngôn ngữđơngiản. 20

C#là ngôn ngữhiện đại. 21

C#là ngôn ngữhướngđối tượng. 21

C#là ngôn ngữmạnhmẽ. 22

C#là ngôn ngữíttừ khóa.22

C#là ngôn ngữmodulehóa. 22

C#sẽ là ngôn ngữ phổ biến. 22

Ngônngữ C#vớingônngữ khác. 23

Các bước chuẩn bị cho chương trình. 24

Chương trình C# đơn giản. 25

Phát triểnchương trình minh họa. 31

Câu hỏi & bài tập. 35

3.Nềntảng ngônngữ C#. 39

Kiểu dữ liệu.40

Kiểu dữ liệu xâydựngsẵn. 41

Chọnkiểu dữ liệu. 42

Chuyểnđổi kiểu dữ liệu. 43

Biến và hằng. 44

Gán giátrịxác định cho biến. 45

Hằng. 46

Kiểu liệt kê. 47

Kiểu chuỗikýtự. 50

Định danh. 50

Biểu thức. 50

Khoảngtrắng. 51

Câu lệnh. 51

Phân nhánh khôngcó điều kiện. 52

Phân nhánh có điều kiện. 53

Câu lệnh lặp. 60

Toántử. 68

Namespace. 76

Các chỉ dẫn biên dịch. 80

Câu hỏi & bài tập. 82

4.Xây dựnglớp - Đốitượng.87

Định nghĩa lớp. 88

Thuộc tính truycập. 91

Thamsố của phươngthức. 92

Tạo đối tượng. 93

Bộkhởidựng.93

Khởi tạo biến thành viên. 96

Bộkhởidựngsao chép. 98

Từkhóa this. 99

Sử dụngcác thành viên static. 100

Gọi phươngthứcstatic. 101

Sửdụngbộ khởi dựngstatic. 101

Sửdụngbộ khởi dựngprivate. 102

Sửdụngthuộctínhstatic.102

Hủyđối tượng. 104

Truyền tham số. 107

Nạp chồng phương thức. 112

Đónggói dữ liệu với thuộc tính. 116

Thuộc tính chỉ đọc. 119

Câu hỏi & bài tập. 121

5.Kế thừa– Đahình. 125

Đặc biệt hóa và tổng quát hóa. 126

Sự kếthừa. 129

Thực thi kế thừa. 129

Gọi phươngthứckhởi dựngcủa lớp cơ sở.131

Gọi phươngthứccủa lớp cơ sở. 132

Điều khiển truyxuất. 132

Đa hình. 133

Kiểu đa hình. 133

Phương thức đahình. 133

Từkhóa new và override. 137

Lớptrừutượng. 139

Gốccủa tất cảcáclớp- lớp Object. 142

Boxing và Unboxing dữ liệu. 144

Boxing dữ liệu ngầmđịnh. 144

Unboxing phải thực hiện tườngminh. 145

Các lớp lồng nhau. 147

Câu hỏi & bài tập. 149

6.Nạp chồng toán tử. 153

Sử dụngtừ khóa operator. 153

Hỗtrợ ngônngữ .NET khác. 154

Sử dụngtoán tử. 154

Toántửso sánh bằng. 156

Toántửchuyển đổi.157

Câu hỏi & bài tập. 163

7.Cấu trúc. 165

Định nghĩa mộtcấu trúc. 165

Tạo cấu trúc.168

Cấu trúclàmộtkiểu giátrị. 168

Gọi bộ khởidựngmặc định. 169

Tạo cấu trúc khônggọi new. 170

Câu hỏi & bài tập. 172

8.Thựcthigiaodiện. 176

Thực thi giao diện. 177

Thực thi nhiều giao diện. 180

Mở rộnggiaodiện. 181

Kết hợp cácgiaodiện. 181

Truycập phương thức giao diện. 187

Gán đốitượng cho giao diện. 187

Toán tử is. 188

Toán tử as. 190

Giao diện đốilập vớitrừu tượng. 192

Thực thi phủquyết giao diện. 193

Thực thi giao diện tường minh. 197

Lựachọn thểhiện phươngthức giao diện. 200

Ẩn thành viên. 200

Câu hỏi & bài tập. 207

9.Mảng, chỉmục, vàtậphợp. 211

Mảng. 212

Khai báo mảng. 213

Giá trịmặcđịnh. 214

Truycập cácthành phần trongmảng. 214

Khởi tạo thành phần trongmảng. 216

Sửdụngtừ khóa params.216

Câu lệnh foreach. 218

Mảngđa chiều. 220

Mảngđachiều cùngkích thước. 220

Mảngđachiều cókích thước khác nhau. 224

Chuyểnđổi mảng. 227

Bộ chỉ mục. 232

Bộchỉmụcvà phép gán. 236

Sửdụngkiểu chỉ sốkhác. 237

Giao diện tập hợp. 241

Giao diện IEnumerable. 242

Giao diện ICollection. 246

Danh sáchmảng. 247

Thực thi IComparable. 251

Thực thi IComparer. 254

Hàng đợi. 259

Ngăn xếp. 262

Kiểu từ điển.265

Hastables. 266

Giao diện IDictionary.267

Tập khóavà tậpgiá trị. 269

Giao diện IDictionaryEnumerator . 270

Câu hỏi & bài tập. 271

10.Xử lýchuỗi. 275

Lớpđốitượng string. 276

Tạo mộtchuỗi. 276

Tạo mộtchuỗi dùngphương thức ToString. 277

Thao táctrên chuỗi.278

Tìmmộtchuỗi con. 285

Chia chuỗi. 286

Thao táctrên chuỗi dùngStringBuilder. 288

Các biểu thức quytắc. 290

Sửdụngbiểu thứcquytắc qua lớp Regex.291

SửdụngRegexđể tìmtập hợp. 294

SửdụngRegexđể gomnhóm. 295

SửdụngCaptureCollection. 298

Câu hỏi & bài tập. 301

11.Cơ chếủyquyềnvàsựkiện. 303

Ủy quyền. 304

Sửdụngủyquyềnxác nhận phươngthứclúcthực thi. 304

Ủyquyềntĩnh. 314

Dùngủyquyềnnhư thuộc tính. 315

Thiết lập thứtự thihành với mảng ủyquyền . 316

Multicasting. 320

Sự kiện. 324

Cơchế publishing-subscribing.324

Sựkiện vàủyquyền. 325

Câu hỏi & bài tập. 333

12.Cáclớpcơ sở .NET. 335

Lớpđốitượng trong .NET Framework . 335

LớpTimer. 337

Lớpvề thư mụcvàhệ thống. 340

LớpMath.342

Lớpthao tác tập tin. 345

Làmviệc với tập tindữ liệu. 351

Câu hỏi & bài tập. 362

13.Xử lýngoại lệ. 364

Phát sinh và bắt giữ ngoại lệ. 365

Câu lệnh throw. 365

Câu lệnh catch. 367

Câu lệnh finally. 373

Những đối tượng ngoại lệ. 375

Tạo riêng các ngoại lệ. 378

Phát sinh lại ngoại lệ. 381

Câu hỏi & bài tập. 385

pdf389 trang | Chuyên mục: Visual C# | Chia sẻ: dkS00TYs | Lượt xem: 2197 | Lượt tải: 1download
Tóm tắt nội dung Ngôn ngữ lập trình C#, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 một ngoại lệ này với một ngoại
lệ khác. Giống như là con lật đật, mỗi con chứa trong một con và đến lượt con bên trong lại
chứa...
 Ví dụ 13.8: Phát sinh lại ngoại lệ & ngoại lệ inner.
-----------------------------------------------------------------------------
namespace Programming_CSharp
{
using System;
// tạo ngoại lệ riêng
public class MyCustomException : System.Exception
{
public MyCustomException( string message, Exception inner): 
base(message, inner)
{
}
}
public class Test
{
public static void Main()
{
Test t = new Test();
Xử Lý Ngoại Lệ
382
Ngôn Ngữ Lập Trình C#
t.TestFunc();
}
// chia hai số và xử lý ngoại lệ
public void TestFunc()
{
try
{
DangerousFunc1();
}
catch (MyCustomException e)
{
Console.WriteLine(“\n{0}”, e.Message);
Console.WriteLine(“Retrieving exception history...”);
Exception inner = e.InnerException;
while ( inner != null)
{
Console.WriteLine(“{0}”, inner.Message);
inner = inner.InnerException;
}
}
 }
public void DangerousFunc1()
{
try
{
DangerousFunc2();
}
catch (System.Exception e)
{
MyCustomException ex = new 
MyCustomException(“E3 – Custom Exception Situation”, e);
throw ex;
}
}
public void DangerousFunc2()
{
try
{
Xử Lý Ngoại Lệ
383
Ngôn Ngữ Lập Trình C#
DangerousFunc3();
}
catch (System.DivideByZeroException e)
{
Exception ex = new Exception(“E2 - Func2 caught divide by zero”, e);
throw ex;
}
}
public void DangerousFunc3()
{
try
{
DangerousFunc4();
}
catch (System.ArithmeticException)
{
throw;
}
catch (System.Exception)
{
Console.WriteLine(“Exception handled here.”);
}
}
public void DangerousFunc4()
{
throw new DivideByZeroException(“E1 – DivideByZero Exception”);
}
}
}
-----------------------------------------------------------------------------
 Kết quả:
E3 – Custom Exception Situation!
Retrieving exception history...
E2 - Func2 caught divide by zero
E1 – DivideByZeroException
-----------------------------------------------------------------------------
Để hiểu rõ hơn ta có thể dùng trình debugger để chạy từng bước chương trình khi đó ta sẽ
hiểu rõ từng bước thực thi cũng như việc phát sinh các ngoại lệ.
Xử Lý Ngoại Lệ
384
Ngôn Ngữ Lập Trình C#
Chương trình bắt đầu với việc gọi hàm DangerousFunc1() trong khối try:
try
{
DangerousFunc1();
}
DangerousFunc1() gọi DangerousFunc2(), DangerousFunc2() lại gọi DangerousFunc3(), và
cuối cùng DangerousFunc3() gọi DangerousFunc4(). Tất cả việc gọi này điều nằm trong khối
try. Cuối cùng, DangerousFunc4() phát sinh ra ngoại lệ DivideByzeroException. Ngoại lệ
này bình thường có chứa thông điệp bên trong nó, nhưng ở đây chúng ta tự do dùng thông
điệp mới. Để dễ theo dõi chúng ta đưa vào các chuỗi xác nhận tuần tự các sự kiện diễn ra.
Ngoại lệ được phát sinh trong DangerousFunc4() và nó được bắt trong khối catch trong hàm
DangerousFunc3(). Khối catch trong DangerousFunc3() sẽ bắt các ngoại lệ Arithmetic-
Exception ( như là DivideByZeroException), nó không thực hiện hành động nào mà chỉ đơn
giản là phát sinh lại ngoại lệ:
catch ( System.ArithmeticException)
{
throw;
}
Cú pháp để thực hiện phát sinh lại cùng một ngoại lệ mà không có bất cứ bổ sung hay hiệu
chỉnh nào là : throw.
Do vậy ngoại lệ được phát sinh cho DangerousFunc2(), khối catch trong DangerousFunc2()
thực hiện một vài hành động và tiếp tục phát sinh một ngoại lệ có kiểu mới. Trong hàm khởi
dựng của ngoại lệ mới, DangerousFunc2() truyền một chuỗi thông điệp mới (“E2 - Func2
caught divide by zero”) và ngoại lệ ban đầu. Do vậy ngoại lệ ban đầu (E1) trở thành ngoại lệ
bên trong của ngoại lệ mới (E2). Sau đó hàm DangerousFunc2() phát sinh ngoại lệ này (E2)
cho hàm DangerousFunc1().
DangerousFunc1() bắt giữ ngoại lệ này, làm một số công việc và tạo ra một ngoại lệ mới có
kiểu là MyCustomException, truyền vào hàm khởi dựng của ngoại lệ mới một chuỗi mới
(“E3 – Custom Exception Situation!”) và ngoại lệ được bắt giữ (E2). Chúng ta nên nhớ rằng
ngoại lệ được bắt giữ là ngoại lệ có chứa ngoại lệ DivideByZeroException (E1) bên trong nó.
Tại thời điểm này, chúng ta có một ngoại lệ kiểu MyCustomException (E3), ngoại lệ này chứa
bên trong một ngoại lệ kiểu Exception (E2), và đến lượt nó chứa một ngoại lệ kiểu
DivideByZeroException (E1) bên trong. Sau cùng ngoại lệ được phát sinh cho hàm TestFunc;
Khi khối catch của TestFunc thực hiện nó sẽ in ra thông điệp của ngoại lệ :
E3 – Custom Exception Situation!
sau đó từng ngoại lệ bên trong sẽ được lấy ra thông qua vòng lặp while:
while ( inner != null)
{
Xử Lý Ngoại Lệ
385
Ngôn Ngữ Lập Trình C#
Console.WriteLine(“{0}”, inner.Message);
inner = inner.InnerException;
}
Kết quả là chuỗi các ngoại lệ được phát sinh và được bắt giữ:
Retrieving exception history...
E2 - Func2 caught divide by zero
E1 – DivideByZero Exception
Câu hỏi và trả lời
Câu hỏi 1: Việc sử dụng catch không có tham số có vẻ như có nhiều sức mạnh do chúng bắt
giữa tất cả các ngoại lệ. Tại sao chúng ta không luôn luôn sử dụng câu lệnh catch không có
tham số để bắt các lỗi?
Trả lời 1: Mặc dù sử dụng catch duy nhất có rất nhiều sức mạnh, nhưng nó cũng làm mất rất
nhiều thông tin quan trọng về ngoại lệ được phát sinh. Khi đó chúng ta sẽ không biết chính
xác loại ngoại lệ xảy ra và khó có thể bảo trì cũng như khắc phục những ngoại lệ sau này. Về
phía người dùng cũng vậy. Nếu chương trình gặp ngoại lệ mà không có thông báo rõ ràng
cho nguời dùng thì có thể làm cho họ hoang mang, và có thể đổ lỗi cho chương trình của
chúng ta không tốt ngay cả những lỗi không phải do ta. Ví dụ như lỗi hết tài nguyên bộ nhớ
do người dùng sử dụng quá nhiều chương trình hoạt động cùng lúc. Tóm lại là chúng ta nên
sử dụng catch với những tham số chi tiết để thực hiện tốt việc quản lý các ngoại lệ được phát
sinh.
Câu hỏi 2: Có phải tất cả những ngoại lệ được đối xử một cách bình đẳng?
Trả lời 2: Không phải, có hai loại ngoại lệ, ngoại lệ hệ thống và ngoại lệ của chương trình
ứng dụng. Ngoại lệ của chương trình ứng dụng thì sẽ không kết thúc chương trình. Còn
ngoại lệ hệ thống thì sẽ kết thúc chương trình. Nói chung đó là những ngoại lệ xuất hiện
trước đây. Hiện nay thì người ta chia ra nhiều mức độ ngoại lệ và tùy theo từng mức độ của
ngoại lệ mà chương trình của chúng ta sẽ được nhận những ứng xử khác nhau. Để biết thêm
chi tiết chúng ta có thể đọc thêm trong tài liệu .NET Framework về xử lý ngoại lệ.
Câu hỏi 3: Như câu trả lời bên trên tại sao tôi phải tìm hiểu nhiều về các ngoại lệ và cách thức
xử lý các ngoại lệ khi chúng được phát sinh?
Trả lời 3: Việc xây dựng một chương trình ứng dụng là hết sức phức tạp, chương trình luôn
tiếm ẩn những yếu tố không ổn định và có thể phát sinh các ngoại lệ dẫn đến những lỗi
không mong muốn. Việc thực hiện bắt giữ các ngoại lệ là hết sức cần thiết trong chương
trình, nó cho phép chúng ta xây dựng được chương trình hoàn thiện hơn và xử lý các thông
điệp ngoại lệ tốt hơn. Tìm hiểu những ngoại lệ đem đến cho chúng ta nhiều kinh nghiệm
trong việc xây dựng các chương trình phức tạp hơn.
Câu hỏi thêm
Câu hỏi 1: Hãy cho biết các từ khóa được sử dụng để xử lý ngoại lệ?
Xử Lý Ngoại Lệ
386
Ngôn Ngữ Lập Trình C#
Câu hỏi 2: Phân biệt giữa lỗi và ngoại lệ?
Câu hỏi 3: Khi thực hiện việc bắt giữ các ngoại lệ. Nếu có nhiều mức bắt giữ ngoại lệ thì
chúng ta sẽ thực hiện mức nào. Từ chi tiết đến tổng quát, hay từ tổng quát đến chi tiết?
Câu hỏi 4: Ý nghĩa của từ khóa finally trong việc xử lý ngoại lệ?
Câu hỏi 5: Câu lệnh nào được dùng để phát sinh ngoại lệ?
Câu hỏi 6: Loại nào sau đây nên được xử lý theo ngoại lệ và loại nào thì nên được xử lý bởi
các mã lệnh thông thường?
a. Giá trị nhập vào của người dùng không nằm trong mức cho phép.
b. Tập tin không được viết mà thực hiện viết.
c. Đối mục truyền vào cho phương thức chứa giá trị không hợp lệ.
d. Đối mục truyền vào cho phương thức chứa kiểu không hợp lệ.
Câu hỏi 7: Nguyên nhân nào dẫn đến phát sinh ngoại lệ?
Câu hỏi 8: Khi nào thì ngoại lệ xuất hiện?
a. Trong khi tạo mã nguồn
b. Trong khi biên dịch 
c. Trong khi thực thi chương trình
d. Khi yêu cầu đựơc đưa ta bởi người dùng cuối.
Câu hỏi 9: Khi nào thì khối lệnh trong finally được thực hiện?
Câu hỏi 10: Trong namespace nào chức các lớp liên quan đến việc xử lý các ngoại lệ? Hãy
cho biết một số lớp xử lý ngoại lệ quan trọng trong namespace này?
Bài tập
Bài tập 1: Hãy viết đoạn lệnh để thực hiện việc bắt giữa ngoại lệ liên quan đến câu lệnh sau
đây:
Ketqua = Sothu1 / Sothu2;
Bài tập 2: Chương trình sau đây có vấn đề. Hãy xác định vấn đề có thể phát sinh ngoại lệ khi
chạy chương trình. Và viết lại chương trình hoàn chỉnh gồm các lệnh xử lý ngoại lệ:
-----------------------------------------------------------------------------
using System;
public class Tester
{
public static void Main()
{
uint so1=0;
int so2, so3;
so2 = -10;
so3 = 0;
// tính giá trị lại
Xử Lý Ngoại Lệ
387
Ngôn Ngữ Lập Trình C#
so1 -= 5;
so2 = 5/so3;
// xuất kết quả
Console.WriteLine("So 1: {0}, So 2:{1}", so1, so2);
}
}
-----------------------------------------------------------------------------
Bài tập 3: Chương trình sau đây có thể dẫn đến ngoại lệ hay không? Nếu có thì hãy cho biết
ngoại lệ có thể được phát sinh. Hãy viết lại chương trình hoàn chỉnh có xử lý các ngoại lệ
bằng cách đưa ra thông điệp về ngoại lệ được phát sinh.
-----------------------------------------------------------------------------
using System;
using System.IO;
public class Tester
{
public static void Main()
{
string fname = "test3.txt";
string buffer;
StreamReader sReader = File.OpenText(fname);
while ( (buffer = sReader.ReadLine()) !=null)
{
Console.WriteLine(buffer);
}
}
}
-----------------------------------------------------------------------------
Bài tập 4: Hãy xem lại các ví dụ trong các chương trước, ví dụ nào có thể phái sinh ngoại lệ
thì hãy thêm các đoạn xử lý ngoại lệ cho ví dụ đó.
Xử Lý Ngoại Lệ
388
Ngôn Ngữ Lập Trình C#
Dùng Visual Studio .NET Xây Dựng Ứng Dụng Windows Form
389

File đính kèm:

  • pdfGiaotrinhCSharpVN.pdf