Bài giảng Lập trình Ứng dụng quản lý - Tuần 5: C#.NET nâng cao

10/3/2018  
Lập trình Ứng dụng quản lý  
C#.NET nâ ng cao  
Nội dung  
Generic Delegate  
Events  
Anonymous Methods  
Lambda Expressions  
Exceptions  
1
10/3/2018  
Nội dung  
Generic Delegates  
Events  
Anonymous Methods  
Lambda Expressions  
Exceptions  
Generic Delegates  
Tương tự với method, delegate cũng có thể cài  
đặt theo kiểu generic (nhằm làm tham số hàm  
chung nhất cho một số trường hợp).  
public delegate void MyDelegate<T>(T param);  
Trong .NET được khai báo sẵn một số các  
generic delegate như: Predicate<T>,  
Action<T>, Comparison<T>,…  
2
10/3/2018  
Generic Delegates thông dụng  
Predicate<T> được sử dụng để kiểm tra các giá  
trị có thỏa mãn một điều kiện nào đó không và trả  
về kiểu bool.  
Action<T> sử dụng để thực hiện các hành động  
với đối tượng mà ta truyền vào và không trả về  
giá trị nào cả.  
Comparison<T> dùng để so sánh hai đối tượng  
cùng kiểu, thường sử dụng trong các trường hợp  
sắp xếp.  
…  
Ví dụ thường gặp nhất là các phương thức tĩnh  
được cung cấp trong class Array.  
Ví dụ  
class Array  
Phương thức tìm kiếm  
T[] Array.FindAll<T>(T[] array, Predicate<T>  
match)  
Phương thức duyệt mảng  
void Array.ForEach<T>(T[] array, Action<T> action)  
Phương thức sắp xếp  
void Array.Sort<T>(T[] array, Comparison<T> comparison)  
3
10/3/2018  
Cách sử dụng  
Generic Delegates Action<> và Func<>  
Từ C# 3.0, Microsoft cung cấp một kiểu delegate  
mới linh hoạt và tiện dụng hơn là Action, Func.  
Action, Func cho phép khai báo và tạo ra các  
dạng delegate với số lượng tham số và kiểu trả  
về khác nhau, tương tự như khi tạo ra một  
method.  
Action, Func được dùng chủ yếu để tạo và lưu  
trữ một anonymous method ngắn gọn bằng  
lambda expression và được sử dụng như  
những method thông thường.  
4
10/3/2018  
Syntax  
Cú pháp để sử dụng Action, Func là viết các kiểu  
của tham số và giá trị trả về vào cặp ngoặc ‘<>’,  
theo sau từ khóa Action, Func.  
Action<T, T, ..., T>  
Func<T, T, ..., TResult>  
Trong đó T là các kiểu của tham số cần truyền vào và  
TResult là kiểu của giá trị trả về.  
Lưu ý là Func yêu cầu ít nhất một tham số trong cặp ‘<>’,  
tức là phải có kiểu trả về. Không để đặt void hay để một  
cặp ngoặc ‘<>’ rỗng khi dùng Func.  
Ví dụ  
static void DisplayMsg(string msg,  
{
ConsoleColor previous = Console.ForegroundColor;  
if (func != null)  
{
Console.ForegroundColor = func(msg);  
}
int count = (new Random()).Next(2, 5);  
if (action != null)  
{
action(msg, count);  
}
Console.ForegroundColor = previous;  
}
5
10/3/2018  
Cá c method  
Cho Func<string, ConsoleColor>  
static ConsoleColor GetColor(string msg)  
{
if (msg.Length >= 10)  
return ConsoleColor.Red;  
if (msg.Length >= 7)  
return ConsoleColor.Yellow;  
if (msg.Length >= 4)  
return ConsoleColor.Blue;  
return ConsoleColor.White;  
}
Cho Action<string, int>  
static void PrintMsg(string msg, int count)  
{
for (int i = 0; i < count; i++)  
{
Console.WriteLine(msg);  
}
}
Hàm main  
static void Main(string[] args)  
{
var func = new Func<string, ConsoleColor>(GetColor);  
var action = new Action<string, int>(PrintMsg);  
DisplayMsg("Test  
Test", func, action);  
}
6
10/3/2018  
Nội dung  
Generic Delegates  
Events  
Anonymous Methods  
Lambda Expressions  
Exceptions  
Events  
Event (sự kiện) là các hành động xảy ra trong  
quá trình chạy chương trình (gõ phím, click chuột,  
nhấn nút,…) và được thông báo để được xử lý  
thích hợp.  
Event không thể biết trước chính xác khi nào xảy  
ra, điều quan trọng là phải được xử lý thích hợp  
khi nó xảy ra.  
Cơ chế publishing và subscribing nghĩa là mỗi  
đối tượng đều có thể publish một tập hợp các  
event để các lớp khác nếu cần xử lý khi nó xảy  
ra thì có thể đăng ký (subscribe) vào danh sá ch  
nhận và như vậy mỗi khi lớp publish phá t sinh  
một event thì tất cả các lớp đã đăng ký sẽ được  
nhận thông báo.  
7
10/3/2018  
Bản chất  
Trong .NET cơ chế event được thực thi với  
những delegate.  
Lớp publisher định nghĩa một delegate và  
những lớp subscriber phải thực thi. Khi một sự  
kiện xuất hiện thì phương thức của lớp  
subscriber được gọi thông qua delegate.  
Một phương thức được dùng để xử lý các sự  
kiện thì được là trình xử lý sự kiện (event  
handler).  
Khai bá o:  
public delegate void myEventHandler();  
public event myEventHandler myEvent;  
hoặc  
public EventHandler myEvent;  
Ví dụ  
8
10/3/2018  
EventHandler  
Được cung cấp sẵn bởi .NET  
Là event cơ bản với delegate được định nghĩa  
delegate void EventHandler(object sender,  
EventArgs e)  
Sử dụng  
class CTest  
{
public event EventHandler EvtChangeHandler;  
//...  
}
static void C_EvtChangeHandler(object sender, EventArgs e)  
{
//...  
}
var c = new CTest();  
c.EvtChangeHandler += C_EvtChangeHandler;  
9
10/3/2018  
Tạo Custom Event Arguments  
Dẫn xuất EventArgs  
public class MyEventArgs : EventArgs  
{
}
Khai báo event phù hợp  
class CTest  
{
public delegate void MyHandler(object sender, MyEventArgs e);  
public event MyHandler EvtMyHandler;  
}
Có dữ liệu cần thiết trong args  
private static void C_EvtMyHandler(object sender, MyEventArgs e)  
{
Console.WriteLine
}
EventHandler<T>  
Mặc định có sẵn trong .NET  
Là dạng generic delegate  
Cho phép sử dụng event mặc định với custom  
event arguments  
public class MyEventArgs : EventArgs  
{
public string msg;  
}
class CTest  
{
//public delegate void MyHandler(object sender, MyEventArgs e);  
//public event MyHandler EvtMyHandler;  
public event EventHandler<MyEventArgs> EvtMyHandler;  
}
10  
10/3/2018  
Nội dung  
Generic Delegates  
Events  
Anonymous Methods  
Lambda Expressions  
Exceptions  
Anonymous Methods  
Anonymous method (tạm dịch là phương thức vô  
danh) là phương thức không có tên được khai báo  
với từ khóa delegate.  
Anonymous method cho phép tạo ra các hành động  
cho một delegate với cách viết inline.  
Cụ thể  
11  
10/3/2018  
Truy xuất biến cục bộ  
Anonymous method không thể truy xuất tham  
số ref hay out của method cha.  
Anonymous method không được có biến cục bộ  
cùng tên với biến của method cha.  
Anonymous method có thể truy xuất thành phần  
dữ liệu của class chứa nó.  
Anonymous method có thể dùng tên biến chung  
với thành phần dữ liệu của class chứa nó.  
Áp dụng trong các Generic Delegate  
static void funcTest()  
{
var sb = new StringBuilder();  
int[] arrInt = new int[] { 3, 5, 7, 2, 10, 43, 12, 34 };  
//sử dụng Predicate  
int[] arrTemp = Array.FindAll<int>(arrInt,  
{  
return value % 2 == 0;  
});  
//sử dụng Action  
Array.ForEach(arrInt, {  
sb.AppendFormat("{0}, ", value);  
});  
//sử dụng Comparison  
Array.Sort(arrInt, {  
return x.CompareTo(y);  
});  
}
12  
10/3/2018  
Áp dụng cho callback method  
static void Main(string[] args)  
{
var c = new CTest();  
c.EvtMyHandler += delegate (object sender, MyEventArgs e)  
{
Console.WriteLine(e.msg);  
};  
c.EvtMyHandler += delegate (object sender, MyEventArgs e)  
{
var str = e.msg.ToUpper();  
Console.WriteLine(str);  
};  
}
Nội dung  
Generic Delegates  
Events  
Anonymous Methods  
Lambda Expressions  
Exceptions  
13  
10/3/2018  
Lambda Expressions  
Có từ C# 3.0  
Có thể nói so với anonymous method, lambda  
expression được coi là một sự cải tiến đáng giá từ  
phiên bản C# 2.0 lên C# 3.0.  
Khi dùng anonymous method có thể tạo các hàm in-  
line nhằm hạn chế việc khai báo các hàm riêng lẻ  
không cần thiết, giúp mã lệnh ngắn gọn hơn.  
Với lambda expression thì có thể viết ngắn gọn và  
dễ dàng hơn nhờ việc cung cấp toán tử và cú pháp  
mới, đồng thời thể hiện sự “thông minh” của  
compiler bằng cách tự nhận diện kiểu của dữ liệu.  
Ngoài ra, đây còn là kĩ thuật để tạo ra các kiểu  
expression tree.  
Syntax  
Dạng của Lambda Expression như sau:  
(input parameters) => expression  
Dấu mở và đóng ngoặc là tùy chọn trong trường hợp chỉ  
có 1 tham số, ngược lại nó là bắt buộc.  
Nếu có nhiều hơn 1 tham số thì chúng sẽ được phân  
cách bằng dấu phẩy (,).  
Kiểu dữ liệu của các tham số có thể được khai báo  
tường minh hoặc không. Nếu không khai báo, trình biên  
dịch sẽ tự xác định kiểu, tuy nhiên trong một số trường  
hợp, cần phải chỉ rõ kiểu dữ liệu.  
14  
10/3/2018  
Ví dụ  
Anonymous method  
var list = new List<int> { 3, 5, 7, 2, 10, 43, 12, 34 };  
var evens = list.FindAll(delegate (int i)  
{
return (i % 2) == 0;  
});  
Dạng đầy đủ  
var evens = list.FindAll((int i) => { return i % 2 == 0; });  
Dạng rút gọn  
var evens = list.FindAll((int i) => ((i % 2) == 0));  
var evens = list.FindAll(i => (i % 2) == 0);  
Đặc điểm  
Kiểu dữ liệu của tham số có thể khai báo tường  
minh hoặc không tường minh.  
Có thể sử dụng {} hoặc () để bọc khối lệnh. Có  
sự khác biệt giữa 2 loại???  
Có thể loại bỏ cặp dấu bọc khối lệnh khi không  
cần thiết.  
15  
10/3/2018  
Truyền tham số trong Lambda Expression  
Nhiều tham số  
var c = new CTest();  
c.EvtMyHandler += =>  
{
Console.WriteLine(e.msg);  
};  
Không có tham số  
Func<int> func = => (new Random()).Next();  
Nội dung  
Generic Delegates  
Events  
Anonymous Methods  
Lambda Expressions  
Exceptions  
16  
10/3/2018  
Exceptions  
Trong quá trình chương trình chạy có rất nhiều  
trường hợp xảy ra lỗi không thể biết trước như:  
lỗi chia 0, lỗi sử dụng đối tượng null, lỗi đọc file  
không tồn tại (hoặc đã bị xóa),…  
Để kiểm soát và xử lý các lỗi như trên thì .NET  
định nghĩa class Exception và cách thức xử lý  
(exception handling).  
Khối lệnh xử lý exception (try…catch…finally)  
át sinh  
ì khối  
c xử lý.  
17  
10/3/2018  
Ví dụ  
Throw exception  
Có thể tự quăng ra exception cho bên ngoài xử lý.  
18  
10/3/2018  
Các property thông dụng  
Property TargetSite: cung cấp thông tin chi tiết  
của method phát sinh exception.  
Property StackTrace: cung cấp thông tin theo dõi  
nơi phát sinh exception.  
Property HelpLink: cho phép sử dụng cung cấp  
thô ng tin URL trang trợ giúp.  
Property Data: cho phép sử dụng lưu trữ thông  
tin dạng IDictionary.  
Bài tập  
Thực hiện lại ví dụ về Siêu thị với Khách hàng  
bằng cách sử dụng event.  
Khách hàng cần thêm các thông tin: địa chỉ, ngày  
sinh.  
Thêm các chức năng:  
Tìm kiếm khách hàng theo các tiêu chí: họ tên, năm sinh,  
địa chỉ.  
Cộng điểm cho các khách hàng có sinh nhật trong tháng.  
Sắp xếp các khách hàng theo địa chỉ rồi theo điểm tích lũy.  
19  
pdf 19 trang myanh 24840 Free
Bạn đang xem tài liệu "Bài giảng Lập trình Ứng dụng quản lý - Tuần 5: C#.NET nâng cao", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_lap_trinh_ung_dung_quan_ly_tuan_5_c_net_nang_cao.pdf