Lập trình Windows 9/18/2018 1 C# NET cơ bản phần tiếp theo Lập trình Ứng dụng quản lý Nội dung Một vài C# keyword Collections Generics Delegates 9/18/2018 2 Nội dung Một vài C# keyword Col[.]
Trang 1C#.NET cơ bảnphần tiếp theoLập trình Ứng dụng quản lý
Trang 2 Giúp chia class thành nhiều phần cài đặt.
{
Trang 3C# keyword: as
Chuyển đổi kiểu thực sự được thực hiện khi
runtime, không phải khi compile
object o = new CTest ();
null
C# keyword: is
Sử dụng trong trường hợp thể hiện trong cây kế
thừa class Shape
Trang 4 Trong NET cung cấp 2 loại collection
Nongeneric collections (namespace
System.Collections).
Generic collections (namespace
System.Collections.Generic)
Trang 5 Kiểu dữ liệu phần tử (item) là object.
ArrayList strArray = new ArrayList();
strArray AddRange( new string [] { "First" , "Second" , "Third" });
Console.WriteLine( "This collection has {0} items." , strArray Count);
Console.WriteLine();
strArray Add( "Fourth!" );
Console.WriteLine( "This collection has {0} items." , strArray Count);
foreach ( string s in strArray )
Kiểm soát kiểu dữ liệu khó khăn
Hiệu năng kém khi phải chuyển đổi kiểu dữ liệu
nhiều lần giữa value type và reference type
Trang 6 Generic nghĩa là “tổng quát” hàm ý đưa ra những cách làm
chung nhất cho nhiều vấn đề.
Tình huống ví dụ cần xây dựng 1 Ngăn xếp (Stack) chứa kiểu
dữ liệu int với các phương thức cơ bản như: push, pop,
check ,… Sau đó lại cần xây dựng cũng Stack với các phương
thức như vậy nhưng dữ liệu lại là string
Giải pháp cho vấn đề trên?
public class IntStack
Trang 7Giải pháp
Cách đầu tiên thường làm: copy lại và thay đổi kiểu
dữ liệu trong code Nếu có yêu cầu đổi kiểu dữ liệu
sang float, double,…???
Cách tốt hơn khi đã biết đến kiểu dữ liệu cơ sở trong
.NET là object Khi sử dụng kiểu dữ liệu object thì
Stackđã chấp nhận được mọi kiểu dữ liệu?
public class ObjectStack
Vấn đề của ObjectStack kể trên là dễ gây ra lỗi
runtime (tức là chỉ giải quyết tốt về mặt syntax)
NET cung cấp giải pháp cho vấn đề này thông
qua khái niệm Generic.
//push vào kiểu string
s Push( "test" );
//lấy ra lại kiểu int
Trang 8Generic Types
Generic là 1 tính năng mới trong NET
Framework 2.0 và và được tích hợp sâu trong
Common Language Runtime (CLR)
Trong NET Framework, Generic được giới thiệu
là khái niệm về các kiểu tham số và được dùng
để thiết kế class và method nhằm để trì hoãn chỉ
ra kiểu dữ liệu cho đến khi chúng được khai báo
hoặc khởi tạo
Một trong những điểm nổi bật của kiểu Generic
là cho phép kiểm tra cú pháp trong lúc biên dịch
Có thể sử dụng nhiều kiểu dữ liệu khác nhau với
cùng 1 đoạn code (tương tự như khái niệm
Template trong C++)
Tham số T
Bằng cách sử dụng tham số T là tham số chung, cho phép
tạo 1 class duy nhất và sử dụng cho nhiều type khác
Trang 9Generic Methods
Là các hàm thông dụng (cách hành xử chung cho
các typekhác nhau) nên cài đặt theo kiểu
Generic (sử dụng các tham số đầu vào hay đầu
Swap< int >( ref iX , ref iY );
Swap< float >( ref fX , ref fY );
C# keyword: default
Lấy giá trị mặc định với các tính chất sau:
Numeric valuesthì giá trị default là 0
Reference typesthì giá trị default là null
Các Fieldđược gán default là 0 (nếu là value
type ) hoặc null (nếu là reference type)
Trang 10Constraining Type Parameters
Generic Constraint Ý nghĩa
NameOfBaseClass
NameOfInterface class GenericTest < > where T : struct
{
T x , y
}
GenericTest < int > gti = new GenericTest < int >();
GenericTest <string> gts = new GenericTest < string >();
Trang 11 Delegatelà kiểu dữ liệu tham chiếu được dùng
để đóng gói một phương thức với tham số và
kiểu trả về xác định
Với delegate một chương trình có thể thực thi
động (dynamic) các phương thức (method) khác
nhau trong quá trình chạy (runtime).
Sau khi methodđược đóng gói trong delegate,
nó sẽ được thực thi (called) khi delegate được
chạy (invoked).
Khai báo delegate
Trang 12Ví dụ
// khai báo delegate
delegate decimal ProcessCalculateHandler ( decimal d1, decimal d2);
static void Main ( string [] args)
{
// tạo đối tượng delegate
ProcessCalculateHandler pcA = new ProcessCalculateHandler ( AddCalculate );
TinhToan (pcA);
}
// method hợp với delegate đã khai báo
static decimal AddCalculate ( decimal d1, decimal d2)
{
return d1 + d2;
}
// phương thức có tham số là delegate
static void TinhToan ( ProcessCalculateHandler pc)
Với mảng các đối tượng SinhVien
Cần sắp xếp mảng theo các tiêu chí khác nhau, giải
pháp???
{
}
SinhVien [] arrSV;
Trang 13delegate int SoSanhHandler ( SinhVien sv1, SinhVien sv2);
static void SapXep( SinhVien [] arrSV, SoSanhHandler ssFunc)
Trang 14Sử dụng delegate để gửi thông báo
Xét yêucầu quản lý cấp độ thẻ thành viên của
siêuthị Khi khách hàng tích lũy điểm nhờ mua
static uint muc1 = 20, muc2 = 30, muc3 = 50;
public string HoTen { get ; }
public string CapDo { get ; private set ; }
public uint DiemTichLuy { get ; private set ; }
public KhachHang( string ht)
Trang 15class SieuThi
{
List < KhachHang > DsKhachHang = new List < KhachHang >();
st.ThemKhachHang( new KhachHang ( "ABC" ));
Trang 16Giải pháp 1
Thêmcờ kiểm soát việc chúc mừng của siêu thị
trong class KhachHang
Thêmphương thức tổng duyệt khách hàng trong
class SieuThi
{
{
{ ChucMungKH(kh);
} }
{
CapDo = "Cap2" ; }
{
CapDo = "Cap1" ; }
Trang 17static void Main( string [] args)
{
st.DsKhachHang.Add( new KhachHang ( "ABC" ));
handlers( this );
} }
Trang 18 Thay đổi trong class SieuThi
Mục tiêu là đăng ký theo dõi KhachHang ngay khi
tạo
Hàm main sẽ không cần thay đổi…
Về vấn đề nơi kiểm soát để phát sinh thông báo?
Khi có số lượng lớn đối tượng có thể phát sinh
thông báo?
Trang 19 Cơ chế multicasting cho phép gọi hai hay nhiều
phương thức thực thi thông qua một ủy quyền
đơn Mục đích chính là với một delegate có thể
gọi thực hiện nhiều hơn một phương thức Để
thực hiện được thì kiểu trả về của delegate phải
delegate void MultiHandler ( decimal d1 , decimal d2 );
static void Main ( string [] args )
{
Trang 20Áp dụng
Xét lại ví dụ về Siêu thị và Khách hàng nếu có
thêm các bộ phận hay đối tác cũng cần quan tâm
đến việc thay đổi cấp độ của khách hàng?
Bộ phận khuyến mãi cần gửi ưu đãi khuyến mãi
mới
Đối tác Tài chính muốn tặng ưu đãi
Thay đổi hàm đăng ký để áp dụng multicasting
Xây dựng class CtyTaiChinh
static string TenCty = "CtyABC" ;
Trang 21 Thay đổi trong class SieuThi
{
List < KhachHang > DsKhachHang = new List < KhachHang >();
st.ThemKhachHang( new KhachHang ( "ABC" ));
st.ThemKhachHang( new KhachHang ( "GHJ" ));
st.ThemKhachHang( new KhachHang ( "NMVVB" ));