một số tính năng nâng cao trong c

0 5 0
một số tính năng nâng cao trong c

Đang tải... (xem toàn văn)

Thông tin tài liệu

LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 1. Chuẩn đầu ra của học phần: L1. Áp dụng các kiến thức về lập trình hướng đối tượng của ngôn ngữ C để xây dựng các ứng dụng. 2. Mục tiêu bài học: Sinh viên cài đặt được các lớp bằng cách mô hình hóa các đối tượng, sử dụng được các kỹ thuật lập trình hướng đối tượng để giải quyết được một số bài tập thực tế. 3. Hình thức, thời lượng dạy học: Lý thuyết (3,5,6) + NỘI DUNG BÀI HỌC ONLINE PHẦN 1. LỚP VÀ ĐỐI TƯỢNG....................................................................................2 1. Tổng quan về lập trình hướng đối tượng.................................................................2 2. OOP là gì? ...............................................................................................................2 3. Lịch sử của OOP......................................................................................................3 4. Tại sao sử dụng OOP?.............................................................................................3 5. Các đặc điểm của OOP............................................................................................5 5.1. Các đối tượng (Objects) ...................................................................................5 5.2. Đặc điểm 1: Tính trừu tượng (Abstraction)......................................................5 5.3. Đặc điểm 2: Tính đóng gói (Encapsulation) ....................................................6 5.4. Đặc điểm 3: Tính thừa kế (Inheritance) ...........................................................7 5.5. Đặc điểm 4: Tính đa hình (Polymorphism)......................................................7 5.6. Tổng hợp (Aggregation)...................................................................................7 6. C nhìn ở góc độ lịch sử.........................................................................................8 7. Tạo class..................................................................................................................8 7.1. Giới thiệu các đối tượng và lớp (object và class).............................................8 7.2. Định nghĩa lớp (class).......................................................................................9 7.3. Tạo các thuộc tính cho class.............................................................................9 7.4. Tạo các phương thức ......................................................................................11 7.5. Phương thức khởi tạo .....................................................................................12 7.6. Nạp chồng (overloading)................................................................................13 7.7. Luyện tập ........................................................................................................13 7.8. Từ khóa static (tĩnh) ..................................................

HỌC PHẦN: LẬP TRÌNH NET Bài 7: MỘT SỐ TÍNH NĂNG NÂNG CAO TRONG C# Delegate (Ủy quyền) 1.1 Ủy quyền gì? Khai báo, khởi tạo gọi ủy quyền 1.2 Sử dụng ủy quyền để xác nhận phương thức lúc thực thi 1.3 Multicast 12 1.4 Kiểu ủy quyền Func Action 14 Anonymous method (phương thức vô danh) 16 Lambda expression 17 Anonymous type 19 Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET Bài 7: MỘT SỐ TÍNH NĂNG NÂNG CAO TRONG C# - Mục tiêu: Bài học cung cấp kiến thức ủy quyền, phương thức vô danh, biểu thức lambda, kiểu vô danh - Yêu cầu: Sinh viên sử dụng ủy quyền để thực thi phương thức, viết biểu thức Lambda tạo đối tượng có kiểu vơ danh - Hình thức tổ chức dạy học: Lý thuyết, tự học - Thời gian: Lý thuyết( lớp: 0; online: 2) Tự học, tự nghiên cứu: - Nội dung: Delegate (Ủy quyền) 1.1 Ủy quyền gì? Khai báo, khởi tạo gọi ủy quyền Ủy quyền kiểu (type), đại diện cho tham chiếu đến phương thức có danh sách tham số kiểu trả cụ thể, tương tự trỏ hàm C C++ + Kiểu (type) delegate định nghĩa tên delegate Cú pháp khai báo ủy quyền mức_truy_cập delegate kiểu_dữ_liệu_trả_về tên_ủy_quyền ([danh_sách_tham_số]); + Khai báo ủy quyền giống khai báo phương thức, có thêm từ khóa delegate khơng có thân phương thức + Câu lệnh khai báo ủy quyền phải đặt mức class name space, không đặt phương thức Ví dụ sau khai báo ủy quyền có tên Del, đóng gói phương thức nhận string làm đối số trả void: public delegate void Del(string s); Khởi tạo ủy quyền Một đối tượng ủy quyền thường khởi tạo cách cung cấp tên phương thức mà ủy quyền đóng gói, với phương thức vơ danh Giả sử ta có phương thức tên DelegateMethod có kiểu trả void nhận tham số kiểu string, tương đồng với kiểu ủy quyền Del public static void DelegateMethod(string message) { Console.WriteLine(message); } Ta khai báo ủy quyền del1 Del del1 Và khởi tạo ủy quyền cách gán phương thức DelegateMethod del1 = DelegateMethod; Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET Gọi (call | invoke) ủy quyền Ngay sau ủy quyền khởi tạo, lời gọi phương thức thực tới ủy quyền ủy quyền chuyển cho phương thức Các tham số lời gọi truyền cho ủy quyền truyền cho phương thức giá trị trả về, có, từ phương thức trả lại cho lời gọi ủy quyền Điều gọi gọi ủy quyền (invoking the delegate) Một ủy quyền khởi tạo gọi thể phương thức đóng gói Cách 1: thay gọi trực tiếp phương thức, ta gọi ủy quyền Các tham số lời gọi truyền cho ủy quyền truyền cho phương thức tên_biến_ủy_quyền (danh_sách_tham_số) Ví dụ: del1("; expected"); Cách 2: sử dụng phương thức Invoke biến ủy quyền để gọi phương thức lưu biến Ví dụ: del1.Invoke("; expected"); Chú ý: biến ủy quyền nhận giá trị null, ta thực thi ủy quyền phát sinh ngoại lệ Vì để an toàn trước thi hành ủy quyền ta nên kiểm tra đảm bảo biến khác null if (del1 != null) del1.Invoke("; expected"); del1?.Invoke("; expected"); Ví dụ 7.1: Làm việc với ủy quyền using System; namespace DemoUyQuyen { class Program { //1 Khai báo kiểu ủy quyền HienThiThongBao tham chiếu đến //các phương thức khơng trả liệu có tham số kiểu string private delegate void HienThiThongBao(string thongBao); static void Main(string[] args) { //2 Khai báo khởi tạo biến ủy quyền del1 HienThiThongBao del1 = ThongBaoLoi; //3 Thực thi ủy quyền del1 thực thi phương thức ThongBaoLoi del1(" thiếu ;"); Console.ReadLine(); Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET } //Khai báo phương thức tương đồng với ủy quyền HienThiThongBao //(tham số, kiểu trả về) private static void ThongBaoLoi(string loi) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\nChuong trinh cua ban co loi bien dich sau: {0}", loi); Console.ResetColor(); } } } Kết quả: Chuong trinh cua ban co loi bien dich sau: thieu ; 1.2 Sử dụng ủy quyền để xác nhận phương thức lúc thực thi Ủy quyền sử dụng để xác định phương thức tĩnh phương thức thể mà khơng biết trước chương trình thực Giả sử minh họa sau, muốn tạo lớp chứa đơn giản gọi Pair lớp lưu giữ xếp hai đối tượng truyền vào cho chúng Tạm thời lúc biết loại đối tượng mà Pair lưu giữ Nhưng cách tạo phương thức bên đối tượng thực việc xếp ủy quyền, ủyquyền thực việc thứ tự cho thân đối tượng Những đối tượng khác xếp khác Ví dụ, Pair chứa đối tượng đếm xếp theo thứ tự số, Pair nút lệnh button theo thứ tự alphabe tên chúng Mong muốn người tạo lớp Pair đối tượng bên Pair phải có trách nhiệm cho biết thứ tự chúng thứ tự thứ hai Để làm điều này, phải đảm bảo đối tượng bên Pair phải cung cấp phương thức cho biết cách xếp đối tượng Chúng ta định nghĩa phương thức yêu cầu việc tạo ủy quyền, ủy quyền định nghĩa chữ ký (signature) kiểu trả phương thức đối tượng để cung cấp cho phép Pair xác định đối tượng đến đối tượng thứ hai Lớp Pair định nghĩa ủy quyền, WhichIsFirst Phương thức Sort lấy tham số thể WhichIsFirst Khi đối tượng Pair cần biết thứ tự đối tượng bên yêu cầu ủy quyền truyền vào hai đối tượng chứa tham số Trách nhiệm việc xác định thứ tự hai đối tượng trao cho phương thức đóng gói ủy quyền Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET Để kiểm tra thực chế ủy quyền, tạo hai lớp, lớp Cat lớpStudent Hai lớp có điểm chung với nhau, ngoại trừ hai thực thi phương thứcđược đóng gói WhichIsFirst Do hai đối tượng lưu giữ bên đối tượng Pair Trong chương trình thử nghiệm, tạo hai đối tượng Student hai đối tượng Cat lưu chúng vào đối tượng Pair Sau tạo đối tượng ủy quyền để đóng gói phương thức chúng, phương thức phải phù hợp với chữ ký kiểu trả ủy quyền Sau yêu cầu đối tượng Pair xếp đối tượng Student Cat, ta làm bước sau: Bắt đầu việc tạo phương thức khởi tạo lớp Pair, lấy hai đối tượng đưa chúng vào mảng: public class Pair { // đưa vào đối tượng theo thứ tự public Pair(object firstObject, object secondObject) { thePair[0] = firstObject; thePair[1] = secondObject; } // mảng lưu đối tượng private object[] thePair = new object[2]; } Tiếp theo phủ phương thức ToString() để chứa giá trị hai đối tượng mà Pair nắm giữ: public override string ToString() { // xuất thứ tự đối tượng thứ trước đối tượng thứ hai return thePair[0].ToString() + "," + thePair[1].ToString(); } Bây có hai đối tượng bên Pair xuất giá trị chúng hình Tiếp tục thực việc xếp in kết xếp Hiện khơng xác định loại đối tượng mà có, ủy quyền định thứ tự xếp cho thân đối tượng mà Pair lưu giữ bên Do vậy, yêu cầu đối tượng lưu giữ bên trongPair thực việc kiểm tra xem đối tượng trước Phương thức lấy hai tham số đối tượng trả giá trị kiểu liệt kê: theFirstComeFirst đối tượng đến trước theSecondComeFirst giá trị thứ hai đến trước Những phương thức yêu cầu đóng gói ủy quyền WhichIsFirst định nghĩa bên lớp Pair: Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET public delegate comparison WhichIsFirst(object obj1, object obj2); Giá trị trả kiểu comparison kiểu liệt kê: public enum comparison { theFirstComesFirst = 1, theSecondComesFirst = } Bất phương thức tĩnh lấy hai tham số kiểu object trả kiểu comparison đóng gói ủy quyền vào lúc thực thi Lúc định nghĩa phương thức Sort cho lớp Pair: public void Sort(WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theSecondComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } Phương thức lấy tham số: ủy quyền có kiểu WhichIsFirst với tên theDelegateFunc Phương thức Sort giao phó trách nhiệm định thứ tự đến trước sau hai đối tượng bên Pair đến phương thức đóng gói ủy quyền Bên thân Sort, phương thức ủy quyền gọi trả giá trị, giá trị hai giá trị liệt kê comparison Nếu giá trị trả theSecondComesFirst, đối tượng bên Pair hoán đổi vị trí, trường hợp ngược lại khơng làm Hãy tưởng tượng xếp Student theo tên Chúng ta viết phương thức trả theFirstComesFirst tên sinh viên đến trước theSecondComesFirst tên sinh viên thứ hai đến trước Nếu đưa vào “Amy, Beth” phương thức trả kết theFirstComesFirst Và ngược lại truyền “Beth, Amy” kết trả theSecondComesFirst Khi nhận kết theSecondComesFirst, phương thức Sort đảo hai đối tượng mảng, thiết lập Amy vị trí đầu cịn Beth vị trí thứ hai Tiếp theo thêm phương thức ReverseSort, phương thức đặt mục mảng theo thứ tự đảo ngược lại: public void ReverseSort(WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theFirstComesFirst) { object temp = thePair[0]; Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET thePair[0] = thePair[1]; thePair[1] = temp; } } Việc thực tương tự phương thức Sort Tuy nhiên, phương thức thực việc hoán đổi phương thức ủy quyền xác định đối tượng trước tới trước Do vậy, kết thực phương thức đối tượng thứ hai đến trước Lúc truyền vào “Amy, Beth”, phương thức ủy quyền trả theFirstComesFirst, phương thức ReverseSort hốn đổi vị trí hai đối tượng này, thiết lập Beth đến trước Điều cho phép sử dụng phương thức ủy quyền tương tự Sort, mà không cần yêu cầu đối tượng hỗ trợ phương thức trả giá trị ngược Lúc điều cần thiết tạo vài đối tượng để xếp Ta tạo hai lớp đối tượng đơn giản sau: lớp đối tượng Student lớp đối tượng Cat Gán cho đối tượng Student tên vào lúc tạo: public class Student { // lớp đối tượng Student public Student(string name) { this.name = name; } } Lớp đối tượng Student yêu cầu hai phương thức, phương thức phủ ToString(), phương thức khác đóng gói phương thức ủy quyền Lớp Student phải phủ phương thức ToString() phương thức ToString() lớp Pair sử dụng cách xác Việc thực thi khơng có phức tạp mà đơn trả tên sinh viên: public override string ToString() { return name; } Student phải thực thi phương thức hỗ trợ cho Pair.Sort() ủy quyền xác định thứ tự hai đối tượng xem đối tượng đến trước: public static comparison WhichStudentComesFirst(Object o1, Object o2) { Student s1 = (Student)o1; Student s2 = (Student)o2; return (String.Compare(s1.name, s2.name) < ? comparison.theFirstComesFirst : comparison.theSecondComesFirst); } String.Compare phương thức NET lớp String, phương thức so sánh hai chuỗi trả giá trị nhỏ chuỗi nhỏ chuỗi thứ hai lớn chuỗi thứ hai nhỏ hơn, giá trị hai chuỗi Theo lý luận Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET giá trị trả theFirstComesFirst chuỗi thứ nhỏ hơn, hai chuỗi hay chuỗi thứ hai lớn hơn, phương thức trả giá trị theSecondComesFirst Ghi phương thức WhichStudentComesFirst lấy hai tham số kiểu đối tượng trả giá trị kiểu liệt kê comparison Điều để làm tương ứng phù hợp với phương thức ủy quyền Pair.WhichIsFirst Lớp thứ hai Cat, để phục vụ cho mục đích chúng ta, Cat xếp theo trọng lượng, nhẹ đến trước nặng Ta có khai báo lớp Cat sau: public class Cat { //lớp đối tượng Cat public Cat(int weight) { this.weight = weight; } // theo thứ tự trọng lượng public static comparison WhichCatComesFirst(Object o1, Object o2) { Cat c1 = (Cat)o1; Cat c2 = (Cat)o2; return c1.weight > c2.weight ? comparison.theSecondComesFirst : comparison.theFirstComesFirst; } public override string ToString() { return weight.ToString(); } // biến lưu trọng lượng private int weight; } Cũng tương tự lớp Student lớp Cat phủ phương thức ToString() thực thi phương thức tĩnh với cú pháp tương ứng với phương thức ủy quyền Và lưu ý phương thức ủy quyền Student Cat không tên với Chúng ta không cần thiết phải làm tên gán đến phương thức ủy quyền lúc thực thi Ví dụ minh họa sau trình bày cách phương thức ủy quyền gọi Ví dụ 7.2: using System; namespace DemoUyQuyenCallBack { // khai báo kiểu liệt kê public enum comparison { Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET theFirstComesFirst = 1, theSecondComesFirst = } // lớp Pair đơn giản lưu giữ đối tượng public class Pair { // khai báo ủy quyền public delegate comparison WhichIsFirst(object obj1, object obj2); // truyền hai đối tượng vào constructor public Pair(object firstObject, object secondObject) { thePair[0] = firstObject; thePair[1] = secondObject; } // phương thức xếp thứ tự hai đối tượng // theo tiêu chuẩn đối tượng public void Sort(WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theSecondComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } // phương thức xếp hai đối tượng theo // thứ tự nghịch đảo lại tiêu chuẩn xếp public void ReverseSort(WhichIsFirst theDelegateFunc) { if (theDelegateFunc(thePair[0], thePair[1]) == comparison.theFirstComesFirst) { object temp = thePair[0]; thePair[0] = thePair[1]; thePair[1] = temp; } } // yêu cầu hai đối tượng đưa giá trị public override string ToString() { return thePair[0].ToString() + "," + thePair[1].ToString(); } // mảng lưu đối tượng private object[] thePair = new object[2]; } Học kết hợp Trang HỌC PHẦN: LẬP TRÌNH NET public class Cat { //lớp đối tượng Cat public Cat(int weight) { this.weight = weight; } // theo thứ tự trọng lượng public static comparison WhichCatComesFirst(Object o1, Object o2) { Cat c1 = (Cat)o1; Cat c2 = (Cat)o2; return c1.weight > c2.weight ? comparison.theSecondComesFirst : comparison.theFirstComesFirst; } public override string ToString() { return weight.ToString(); } // biến lưu trọng lượng private int weight; } public class Student { // lớp đối tượng Student public Student(string name) { this.name = name; } // theo thứ tự chữ public static comparison WhichStudentComesFirst(Object o1, Object o2) { Student s1 = (Student)o1; Student s2 = (Student)o2; return (String.Compare(s1.name, s2.name) < ? comparison.theFirstComesFirst : comparison.theSecondComesFirst); } public override string ToString() { return name; } // biến lưu tên private string name; } class Program { Học kết hợp Trang 10 HỌC PHẦN: LẬP TRÌNH NET public static void Main() { // tạo hai đối tượng Student Cat // đưa chúng vào hai đối tượng Pair Student Thao = new Student("Thao"); Student Ba = new Student("Ba"); Cat Mun = new Cat(5); Cat Ngao = new Cat(2); Pair studentPair = new Pair(Thao, Ba); Pair catPair = new Pair(Mun, Ngao); Console.WriteLine("Sinh vien \t\t\t: {0}", studentPair.ToString()); Console.WriteLine("Meo \t\t\t: {0}", catPair.ToString()); // tạo ủy quyền Pair.WhichIsFirst theStudentDelegate = new Pair.WhichIsFirst(Student.WhichStudentComesFirst); Pair.WhichIsFirst theCatDelegate = new Pair.WhichIsFirst(Cat.WhichCatComesFirst); // xếp dùng ủy quyền studentPair.Sort(theStudentDelegate); Console.WriteLine("Sau sap xep studentPair\t\t:{0}", studentPair.ToString()); studentPair.ReverseSort(theStudentDelegate); Console.WriteLine("Sau sap xep nguoc studentPair\t\t:{0}", studentPair.ToString()); catPair.Sort(theCatDelegate); Console.WriteLine("Sau sap xep catPair\t\t:{0}", catPair.ToString()); catPair.ReverseSort(theCatDelegate); Console.WriteLine("Sau sap xep nguoc catPair\t\t:{0}", catPair.ToString()); Console.ReadLine(); } } } Kết quả: Sinh vien Meo : Thao,Ba : 5,2 Sau sap xep studentPair :Ba,Thao Sau sap xep nguoc studentPair Sau sap xep catPair Học kết hợp :Thao,Ba :2,5 Trang 11 HỌC PHẦN: LẬP TRÌNH NET Sau sap xep nguoc catPair :5,2 1.3 Multicast Cơ chế multicast cho phép gọi nhiều phương thức thực thi thông qua ủy quyền đơn Điều hồn tồn khác với việc có tập hợp ủy quyền, số chúng gọi phương thức Ủy quyền Multicast kết hợp từ ủy quyền khác phép toán cộng (+) Kết ủy quyền Multicast gọi đến tất phương thức thực thi nguyên thủy hai bên Ví dụ, giả sử del1 del2 thể kiểu ủy quyền, dòng lệnh theo sau kết hợp chúng lại với tạo ủy quyền Multicast mới: multiDel = del1 + del2 Chúng ta thêm ủy quyền vào ủy quyền Multicast toán tử cộng (+=) Phép tốn thêm ủy quyền phía bên phải toán tử vào ủy quyền Multicast bên trái Ví dụ, giả sử có del3 multiDel ủy quyền, lệnh sau thực việc thêm ủy quyền del3 vào multiDel: multiDel += del3; Để xóa ủy quyền xóa phương thức khỏi danh sách gọi ủy quyền ta sử dụng tốn tử - -= Ví dụ, xóa ủy quyền del2 khỏi danh sách gọi multiDel multiDel -= del2; Ví dụ 7.3: Kết hợp ủy quyền using System; namespace DemoMulticast { class Program { // Khai báo ủy quyền private delegate void HienThiThongBao(string thongBao); static void Main(string[] args) { // Khởi tạo ủy quyền del1, đóng gói phương thức ThongBaoLoi HienThiThongBao del1 = ThongBaoLoi; // Khởi tạo ủy quyền del2, đóng gói phương thức GuiThongDiep HienThiThongBao del2 = GuiThongDiep; Học kết hợp Trang 12 HỌC PHẦN: LẬP TRÌNH NET //Khai báo ủy quyền multicast HienThiThongBao multiDel; //Khởi tạo ủy quyền multicast multiDel = del1 + del2; //Sau thực lệnh multiDel = del1 + del2; danh sách //gọi ủy quyền multiDel gồm có phương thức //ThongBaoLoi GuiThongDiep HienThiThongBao del3 = CanhBao; multiDel += del3; //Sau thực lệnh multiDel += del3; danh sách gọi //ủy quyền multiDel gồm có phương thức ThongBaoLoi //GuiThongDiep CanhBao multiDel += CanhBao; multiDel += CanhBao; //Sau thực lệnh multiDel += CanhBao; lần ủy quyền //multiDel gọi phương thức ThongBaoLoi lần, GuiThongDiep //1 lan, CanhBao lần multiDel -= del2; //Sau thực lệnh multiDel -= del2; ủy quyền multiDel // gọi phương thức ThongBaoLoi lần CanhBao lần, // phương thức GuiThongDiep bị xóa khỏi danh sách gọi multiDel("ABC"); Console.ReadLine(); } //Khai báo phương thức tương đồng với ủy quyền HienThiThongBao //(tham số, kiểu trả về) private static void ThongBaoLoi(string loi) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("\nChuong trinh cua ban co loi bien dich sau: {0}", loi); Console.ResetColor(); } //phương thức có signature tương đồng với ủy quyền static void GuiThongDiep(string ten) { Console.WriteLine("\nThong diep da duoc gui cho: {0}", ten); } //phương thức có signature tương đồng với ủy quyền static void CanhBao(string phienBan) { Học kết hợp Trang 13 HỌC PHẦN: LẬP TRÌNH NET Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("\nBan nen dung phien ban {0}", phienBan); Console.ResetColor(); } } } Kết quả: Chuong trinh cua ban co loi bien dich sau: ABC Ban nen dung phien ban ABC Ban nen dung phien ban ABC Ban nen dung phien ban ABC 1.4 Kiểu ủy quyền Func Action 1.3.1 Func Là kiểu ủy quyền tương ứng với phương thức có trả liệu Cú pháp khai báo đối tượng ủy quyền dùng Func Func biến_ủy_quyền; + Kiểu trả phương thức khai báo Func bắt buộc phải có + Số lượng tham số đầu vào từ - 16 Ví dụ: Khai báo biến ủy quyền del1, tham chiếu đến phương thức có tham số đầu vào có kiểu int string, phương thức trả kiểu bool Func del1; - Nếu dùng cách thông thường, khai báo tương ứng với //Khai báo ủy quyền lớp delegate bool TenUyQuyen(int ts1, string ts2); //Khai báo biến ủy quyền phương thức TenUyQuyen del1; 1.3.2 Action Là kiểu ủy quyền tương ứng với phương thức không trả liệu (kiểu trả void) Cú pháp khai báo đối tượng ủy quyền dùng Action Action biến_ủy_quyền; Số lượng tham số đầu vào từ - 16 Ví dụ: Khai báo biến ủy quyền del2, tham chiếu đến phương thức có tham số đầu vào có kiểu double string, phương thức khơng trả liệu Action del2; - Nếu dùng cách thông thường, khai báo tương ứng với Học kết hợp Trang 14 HỌC PHẦN: LẬP TRÌNH NET //Khai báo ủy quyền lớp delegate void TenUyQuyen(double ts1, string ts2); //Khai báo biến ủy quyền TenUyQuyen del2; Ví dụ 7.4: Sử dụng Func Action using System; namespace Demo_Func_Action { class Program { static void Main(string[] args) { Console.WriteLine("\nSU DUNG FUNC"); //Khai báo biến ủy quyền dùng Function Func del1 = Cong2So; //In kết tính tốn số, ví dụ Console.WriteLine("\n{0} + {1} = {2}", 3, 5, del1(3, 5)); Console.WriteLine("\nSU DUNG ACTION"); //Khai báo ủy quyền dùng Action Action del2 = XepLoaiHocSinh; //In xếp loại học sinh, ví dụ điểm trung bình 7.5 del2(7.5); Console.ReadLine(); } //phương thức có tham số kiểu trả tương đồng với ủy quyền //được khai báo Func private static int Cong2So(int a, int b) { return a + b; } //phương thức có tham số kiểu trả tương đồng với ủy quyền //được khai báo Action static void XepLoaiHocSinh(double diemTB) { if (diemTB >= 8) Console.WriteLine("\nHoc sinh dat loai: Gioi"); else if (diemTB >= 6.5) Console.WriteLine("\nHoc sinh dat loai: Kha"); else if (diemTB >= 5) Console.WriteLine("\nHoc sinh dat loai: Trung binh"); else if (diemTB >= 3.5) Console.WriteLine("\nHoc sinh dat loai: Yeu"); else Console.WriteLine("\nHoc sinh dat loai: Kem"); } Học kết hợp Trang 15 HỌC PHẦN: LẬP TRÌNH NET } } Kết quả: SU DUNG FUNC 3+5=8 SU DUNG ACTION Hoc sinh dat loai: Kha - Anonymous method (phương thức vô danh)  Phương thức vô danh phương thức khơng có tên  Được khai báo việc tạo thể ủy quyền cho phương thức đó, sử dụng tốn tử delegate  Kiểu liệu trả phương thức vô danh suy từ lệnh return bên thân phương thức Ví dụ: Func sum = delegate (int a, int b) { return a + b; }; Console.WriteLine(sum(3, 4)); Kết quả: Khi sử dụng toán tử delegate , ta bỏ qua danh sách tham số Nếu làm điều đó, phương thức vơ danh tạo chuyển đổi thành kiểu ủy quyền với danh sách tham số nào, ví dụ sau: Action greet = delegate { Console.WriteLine("Hello!"); }; greet(); Action introduce = delegate { Console.WriteLine("This is world!"); }; introduce(42, 2.7); Kết quả: Học kết hợp Trang 16 HỌC PHẦN: LẬP TRÌNH NET Hello! This is world! - Lambda expression Biểu thức lambda sử dụng để tạo phương thức vơ danh Sử dụng tốn tử lambda => để tách danh sách tham số lambda khỏi phần thân Biểu thức lambda có hai dạng: Expression lambda Statement lambda 3.1 Expression lambda: Một biểu thức lambda có biểu thức bên phải tốn tử => gọi expression lambda Một expression lambda trả kết biểu thức có cấu trúc sau: (input-parameters) => expression Thân biểu thức lambda chứa lời gọi phương thức 3.2 Statement lambda Một statement lambda giống Expression lambda, câu lệnh đặt cặp dấu { } (input-parameters) => { } Phần thân statement lambda bao gồm số lượng câu lệnh Ví dụ: Action greet = name => { string greeting = $"Hello {name}!"; Console.WriteLine(greeting); }; greet("World"); Kết quả: Hello World! 3.3 Các tham số đầu vào (input parameters) biểu thức lambda Các tham số đầu vào biểu thức lambda đặt cặp dấu ngoặc đơn Chỉ định khơng có tham số đầu vào dấu ngoặc đơn ( ): Action line = () => Console.WriteLine(); Nếu biểu thức lambda có tham số, cặp dấu ( ) tùy chọn: Func cube = x => x * x * x; Nếu có hai nhiều tham số hơn, tham số phân cách dấu , Func isTooLong = (int x, string s) => s.Length > x; Có thể khơng cần khai báo kiểu tham số Học kết hợp Trang 17 HỌC PHẦN: LẬP TRÌNH NET Func testForEquality = (x, y) => x == y; Tất tham số đầu vào phải khai báo kiểu tường minh ngầm định, khơng có lỗi biên dịch Ví dụ 7.5: phương thức vô danh biểu thức lambda using System; namespace Demo_Lambda { class Program { static void Main(string[] args) { Console.WriteLine("\nSu dung FUNC va PHUONG THUC VO DANH"); //Khai báo ủy quyền dùng Function Func del1; //Khởi tạo ủy quyền dùng phương thức vô danh del1 = delegate (int x, int y) { return x + y; }; //In kết tính tốn số, ví dụ Console.WriteLine("\n{0} + {1} = {2}", 2, 4, del1(2, 4)); Console.WriteLine("\nSu dung ACTION va BIEU THUC LAMBDA"); //Khai báo ủy quyền dùng Action Action del2; //Khởi tạo ủy quyền dùng biểu thức lambda del2 = (double diemTB) => { if (diemTB >= 8) Console.WriteLine("\nHoc sinh dat loai: Gioi"); else if (diemTB >= 6.5) Console.WriteLine("\nHoc sinh dat loai: Kha"); else if (diemTB >= 5) Console.WriteLine("\nHoc sinh dat loai: Trung binh"); else if (diemTB >= 3.5) Console.WriteLine("\nHoc sinh dat loai: Yeu"); else Console.WriteLine("\nHoc sinh dat loai: Kem"); }; //In xếp loại học sinh, ví dụ điểm trung bình del2(9); Console.ReadLine(); } } } Học kết hợp Trang 18 HỌC PHẦN: LẬP TRÌNH NET Kết quả: Su dung FUNC va PHUONG THUC VO DANH 2+4=6 Su dung ACTION va BIEU THUC LAMBDA Hoc sinh dat loai: Gioi - Anonymous type Anonymous type (kiểu vô danh) cho phép dễ dàng đóng gói tập thuộc tính đọc vào đối tượng mà trước khơng cần phải xác định tường minh kiểu (type) + Tên kiểu tạo trình biên dịch khơng có sẵn cấp mã nguồn + Kiểu thuộc tính suy trình biên dịch + Tạo kiểu vô danh cách sử dụng toán tử new với việc khởi tạo đối tượng Cú pháp: var tên-đối-tượng = new { tên-thuộc-tính = giá-trị [, ] }; Ví dụ tạo đối tượng kiểu vơ danh có ba thuộc tính mã sách, tên sách giá var sach = new { MaSach = "S01", TenSach = "Lap trinh c#", Gia = 100 }; Kiểu vô danh sử dụng nhiều truy vấn LINQ Chú ý: + Thuộc tính đối tượng vơ danh đọc Vì ta cố gắng gán giá trị cho thuộc tính đối tượng bị lỗi + Để truy cập thuộc tính đối tượng vơ danh ta viết: tên-đối-tượng tên-thuộctính Ví dụ: in tên đối tượng sách Console.WriteLine(sach.TenSach); Học kết hợp Trang 19

Ngày đăng: 19/09/2023, 00:23

Tài liệu cùng người dùng

Tài liệu liên quan