Professional Documents
Culture Documents
Tinh Chat Huong Doi Tuong C#
Tinh Chat Huong Doi Tuong C#
1
I. NỀN TẢNG CỦA .NET:
I.1 Công nghệ Microsoft .NET:
- C# là một trong bốn ngôn ngữ chính thuộc bộ Visual Studio.NET của
hãng Microsoft (C#, VB.NET, C++.NET, J#.NET). Công nghệ
Microsoft.NET gồm hai thành phần chính:
Framework và IDE (Integrated Development Environment).
- IDE của Microsoft.NET cung cấp một môi trường, giúp chúng ta triển
khai một ứng dụng trên nền .NET một cách dễ dàng nhanh chóng. IDE
là công cụ lập trình trực quan (visual) dự trên nền Framework. Nếu
không có IDE, ta có thể dùng một chương trình soạn thảo văn bản như
Notepad để soạn thảo chương trình rồi dùng command line để biên
dịch và thực thi, tuy nhiên việc này mất nhiều thời gian.
- Framework của Microsoft là hạ tầng cơ bản được chuẩn hóa, độc lập
ngôn ngữ lập trình, cho phép xây dựng, biên dịch, chạy các dịch vụ
Web, XML hoặc các chương trình được viết bằng các ngôn ngữ hỗ
trợ .NET trên nền hệ điều hành có cài đặt .NET Framework.
2
I. NỀN TẢNG CỦA .NET:
I.2 Tổng quan về .NET Framework:
.NET Framework gồm hai thành phần chính là CLR và FCL.
CLR
CLR (Common Language Runtime) được xem như là máy ảo .NET (.NET
Virtual Machine). Nó là môi trường để thực thi, quản lý bộ nhớ, quản lý tiểu
trình cho các ứng dụng được hỗ trợ bởi .NET.
- Quản lý quá trình thực thi của chương trình: chọn trình biên dịch tương ứng
với ngôn ngữ lập trình. Biên dịch chương trình sang tập tin MSIL (Microsoft
Intermediate Language), biên dịch từ mã định dạng MSIL sang mã máy bằng
trình JIT (Just In Time), rồi sau đó CLR cung cấp cơ sở hạ tầng để thi hành
chương trình.
- Quản lý bộ nhớ: tự quản lý bộ nhớ là một trong những dịch vụ mà CLR cung
cấp trong quá trình thực thi chương trình. Trình thu gom rác (Garbage
Collector) quản lý bộ nhớ đã cấp phát cho một tiến trình rồi sau đó tự động thu
lại khi chương trình kết thúc.
3
I. NỀN TẢNG CỦA .NET:
I.2 Tổng quan về .NET Framework:
.NET Framework gồm hai thành phần chính là CLR và FCL.
FCL
FCL (Framework Class Library): là bộ thư viện có trên 5000 lớp thư viện, bao
gồm các lớp cơ sở, các lớp về dữ liệu và XML, các lớp dành cho dịch vụ web,
web form, windows form là cơ sở cho việc viết các ứng dụng Console,
Windows Form, ASP.net, XML Web, các dịch vụ Windows.
4
Applications
Utilities
FCL
Bộ thư viện
CLR
Máy ảo .NET
Operating System
Ví dụ 1:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World");
Console.ReadLine();
}
}
}
6
I. NỀN TẢNG CỦA .NET:
I.3 Ví dụ chương trình C# đơn giản:
class Program
Ví dụ .2: {
static void Main(string[] args)
class HOCSINH
{
{
HOCSINH hs = new HOCSINH();
private string hoten; hs.Nhap();
private int toan, van; hs.Xuat();
private float dtb; }
public void Nhap() }
{
Console.Write("Nhap ho ten: "); hoten = Console.ReadLine();
Console.Write("Nhap diem van: "); van = int.Parse(Console.ReadLine());
Console.Write("Nhap diem toan: "); toan = int.Parse(Console.ReadLine());
dtb = (float)(toan + van) / 2;
}
public void Xuat()
{
Console.WriteLine("Diem trung binh: {0:0.00}", dtb);
}
}
7
I. NỀN TẢNG CỦA .NET:
I.4 Không gian tên (Namespace):
8
I. NỀN TẢNG CỦA .NET:
I.4 Không gian tên (Namespace):
- Để sử dụng một không gian tên nào đó, ta dùng từ khóa using để khai báo nếu
không gian tên của lớp này khác với không gian tên của lớp sử dụng nó.
- Để khai báo không gian tên, ta sử dụng từ khóa namespace sau khi khai báo sử
dụng các không gian tên khác
Ví dụ:
using System.Data;
using System.Drawing;
using System.Text;
namespace MyNamespace
{
//khai báo các lớp (class) ở đây
}
9
I. NỀN TẢNG CỦA .NET:
I.5 C# có tính chất hướng đối tượng:
Tính chất hướng đối tượng của C# thể hiện qua các điểm sau:
- Sự đóng gói (Encapsulation).
- Kế thừa và đa hình (inheritance and polymorphism).
- Cho phép nạp chồng phương thức (overloading).
- Cho phép nạp chồng toán tử (operator).
- Cho phép tạo và thực thi giao diện (interface).
- Cho phép ủy quyền (deligate).
10
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:
• Lớp đối tượng: Định nghĩa các thuộc tính (đặc điểm) và phương thức
(hành vi) chung cho tất cả các đối tượng của cùng một loại.
• Đối tượng: Thể hiện cụ thể của một lớp đối tượng.
• Ví dụ: Lớp SINHVIEN
- Thuộc tính: Họ tên, giới tính, ngày tháng năm sinh, điểm trung bình,
đối tượng ưu tiên, ...
- Phương thức: Học bài, làm bài thi, làm bài tập, ...
Sinh viên Nguyễn Văn A, Lý Thị B là đối tượng thuộc lớp SINHVIEN
11
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:
class <Tên lớp>
{
<từ khóa truy xuất> thuộc tính;
<từ khóa truy xuất> phương thức();
}
• public: Truy xuất mọi nơi (phương thức thường sử dụng).
• protected: Truy xuất trong nội bộ lớp hoặc trong các lớp con, được
sử dụng cho lớp cơ sở (lớp cha)
• private (mặc định): Chỉ được truy xuất trong nội bộ lớp (thuộc tính
thường sử dụng).
12
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:
Ví dụ:
class HOCSINH
{
private string hoten;
private int toan, van;
private float dtb;
public void Nhap()
{
// Cài đặt
}
public void Xuat()
{
//Cài đặt
}
}
13
I. NỀN TẢNG CỦA .NET:
I.6 Lớp và đối tượng:
14
II. PHƯƠNG THỨC:
II.1 Mẫu khai báo phương thức:
Phương thức (method) có thể được xem như là một hàm hay một chương trình
con thuộc một lớp.
15
II. PHƯƠNG THỨC:
II.2 Phương thức Main:
Phương thức Main được xem như là một điểm vào (entry point)
Main của một chương trình viết bằng C#.
using System;
namespace MethodProject
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(“Hello C#”);
Console.ReadLine();
}
}
}
16
II. PHƯƠNG THỨC:
II.3 Phương thức static:
Phương thức static có thể được gọi trực tiếp thông qua tên lớp, còn
static phương thức không phải là static thì phải gọi gián tiếp thông qua một
đối tượng của lớp.
using System;
using System.Collections.Generic; namespace MethodProject
using System.Text; {
class Program
namespace MethodProject {
{ static void Main(string[] args)
class Class1 {
{ int kq;
public int a=0; kq=Class1.Nhan();
public int b=0; Console.WriteLine(“kq={0}”,ketqua);
public static float Nhan() }
{ }
return a*b; }
}
}
} 17
II. PHƯƠNG THỨC:
II.4 Khai báo chồng phương thức (Overload):
Các phương thức có thể có tên trùng nhau. Khi các phương
Overload thức trùng tên thuộc cùng một lớp thì các tham số của chúng
phải khác nhau về kiểu hoặc số lượng tham số
namespace LopDiemKyTu
{
class CToaDo
{
private int x, y;
public KhoiTao(int xx, int yy) {…}
public KhoiTao() {…}
public KhoiTao(CToaDo a) {…}
public KhoiTao(float xx, float yy) {…}
}
}
18
II. PHƯƠNG THỨC:
II.5 Từ khóa out, ref và params:
Từ khóa ref chỉ định tham số truyền vào phương thức dưới dạng
ref tham biến. Mọi sự thay đổi về gía trị của tham số bên trong phương
thức đều được giữ lại sau khi ra khỏi phương thức.
using System;
class Program
{
static void HoanVi(ref int a, ref int b)
{
int tam = a; a = b; b = tam;
Console.WriteLine("Trong HoanVi: a = " + a + ";b = " + b);
}
static void Main(string[] args)
{
int a = 5, b = 21;
Console.WriteLine("Truoc khi hoan vi: a = {0}; b = {1}", a, b);
HoanVi(ref a, ref b);
Console.WriteLine("Sau khi goi HoanVi: a = " + a + ";b = " + b);
}
19
}
II. PHƯƠNG THỨC:
II.5 Từ khóa out, ref và params:
Từ khóa out cũng dùng để chỉ định tham số được truyền vào phương
out thức dưới dạng tham biến. Nhưng có sự khác biệt với từ khóa ref, đó
là tham số truyền vào không cần khởi tạo trước đó.
using System;
class Program
{
static void HoanVi(out int a, out int b)
{ a = 5; b = 21;
Console.WriteLine("Truoc khi hoan vi: a = {0}; b = {1}", a, b);
int tam = a; a = b; b = tam;
Console.WriteLine("Trong HoanVi: a = " + a + ";b = " + b);
}
static void Main(string[] args)
{ int a, b;
HoanVi(out a, out b);
Console.WriteLine("Sau khi goi HoanVi: a = " + a + ";b = " + b);
}
} 20
II. PHƯƠNG THỨC:
II.5 Từ khóa out, ref và params:
Từ khóa params cho phép chỉ định tham số của phương thức là mảng tham
params số hoặc khi số lượng tham số quá nhiều. Sau từ khóa params, C# không cho
phép sử dụng thêm các từ khóa khác liên quan đến khai báo tham biến.
namespace ParamsKeywordProject
{
class Program
namespace ParamsKeywordProject {
{ static void Main(string[] args)
class Class1 {
{ Class1 a=new Class1();
public void WithParams(params int[] arr) int i = 10, j = 20, k = 30;
{…} cls.WithParams(i,j,k,40);
} int[] n=new int[] {20,30,50,
} 60};
cls.WithParams(a);
}
}
21
}
II. PHƯƠNG THỨC:
II.5 Delegate:
Delegate là một đối tượng tham chiếu đến một phương thức, bất kỳ
Delegate khi nào deligate được goi thì phương thức sẽ được tham chiếu
using System;
namespace DefineDelegateProject
{ class Program
{
delegate void MyDelegate(int i, int j); //khai báo deligate
static void Main(string[] args)
{ Console.WriteLine("instantiate Delegate");
MyDelegate del = new MyDelegate(Program.TotalValue);
del(10,20);
Console.ReadLine();
}
static void TotalValue(int a, int b)
{ int c = a + b;
Console.WriteLine("a+b={0}",c);
}
22
}
}
II. PHƯƠNG THỨC:
II.6 Constructor (phương thức thiết lập):
Là phương thức có tên trùng với tên lớp chứa nó. Các constructor
Constructor này sẽ tự động thực hiện khi đối tượng được sinh ra. Chúng thường
được dùng để khởi tạo dữ liệu ban đầu cho đối tượng.
Các phương thức thiết lập này có các đặc điểm sau:
- Không có giá trị trả về.
- Tên phương thức trùng với tên lớp.
- Có thể có hoặc không có tham số.
- Khi gọi sử dụng chúng, ta phải dùng từ khóa new
24
II. PHƯƠNG THỨC:
II.7 Destructor và Garbage Collector:
Destructor (phương thức hủy) được khai báo có cùng tên với tên
Destructor lớp chứa nó nhưng được thêm ký tự ‘~’ trước tên và không có
tham số với cú pháp như sau:
~ClassName()
{ //code của destructor }
}
Khi lớp có khai báo destructor thì chúng sẽ gọi tiến trình Garbage Collector
(GC) trong C#. Bằng cách gọi kỹ thuật này, hệ thống sẽ đánh dấu đối tượng
chứa destructor trong bộ nhớ sau đó hủy chúng
25
II. PHƯƠNG THỨC:
II.7 Destructor và Garbage Collector:
Kỹ thuật Garbage Collector giải phóng bộ nhớ của đối tượng
Garbage Collector đã chiếm đóng trong bộ nhớ rồi sau đó hủy chúng. GC thực
hiện theo những bước sau:
27
II. PHƯƠNG THỨC:
II.8 Cài đặt phép toán (Operator):
public static TênLớp operator Ký hiệu(TênLớp trái, TênLớp phải)
Ký hiệu: Gồm các ký hiệu phép toán số học,
logic và so sánh
Operator
Trái: Tên tham số sẽ nằm bên trái phép toán
Phải: Tên tham số sẽ nằm bên phải phép toán
28
II. PHƯƠNG THỨC:
II.8 Cài đặt phép toán (Operator):
class CPHANSO
Operator {
private int tuso, mauso;
public CPHANSO(int t, int m)
{
tuso = t; mauso = m;
}
public static CPHANSO operator +(CPHANSO ps1, CPHANSO ps2)
{
int tu = ps1.tuso*ps2.mauso + ps2.tuso*ps1.mauso;
int mau = ps1.mauso*ps2.mauso;
CPHANSO c = new CPHANSO(tu, mau);
return c;
}
public void Xuat()
{
Console.WriteLine("{0}/{1}", tuso, mauso);
}
}
29
II. PHƯƠNG THỨC:
II.9 Nạp chồng phương thức WriteLine:
• Phương thức WriteLine() chỉ xuất những dữ liệu có kiểu cơ bản.
WriteLine Ví dụ:
int a = 4; float b = 7;
Console.WriteLine(“a={0}, b={1}”, a, b);
• Đối với đối tượng thì phương thức WriteLine() không thực hiện được
Giả sử có lớp phân số (CPHANSO):
CPHANSO ps = new CPHANSO(5, 3);
Console.WriteLine(“Phan so: “ + ps);
C# sẽ báo lỗi.
Để sử dụng được Console.WriteLine(“Phan so: “ + ps); cho đối tượng ps, ta phải
nạp chồng phương thức ToString() như sau:
public override string ToString()
{
string s=Tạo chuỗi cần xuất gồm các các thuộc tính của đối tượng;
return s;
} 30
II. PHƯƠNG THỨC:
II.9 Nạp chồng phương thức WriteLine:
class CPHANSO
{
private int tuso, mauso;
public CPHANSO(int t, int m)
{
static void Main(string[] args)
tuso = t;
{
mauso = m; CPHANSO a = new CPHANSO(3, 5);
} Console.WriteLine( a.ToString());
public override string ToString() }
{
string s = tuso.ToString() + "/" + mauso.ToString();
return s;
}
public void Xuat()
{
Console.WriteLine("{0}/{1}", tuso, mauso);
}
} 31
III. THUỘC TÍNH:
III.1 Xây dựng property:
Ví dụ: thực hiện truy xuất và gán dữ liệu như sau:
class ViDu
class Program
{
private int a, b; {
public void Nhap() static void Main(string[] args)
{ {
…
ViDu vd = new ViDu();
}
public void Xuat() vd.a = 5; // Lỗi
{ vd.b = 4; //Lỗi
… vd.Xuat();
} }
}
}
32
III. THUỘC TÍNH:
III.1 Xây dựng property:
C# cung cấp một hình thức khai báo gọi là property để thao tác trên
thuộc tính (gán và đọc dữ liệu) của đối tượng.
Cách định nghĩa property
Định nghĩa cho tất cả các thuộc tính cho lớp
public <kiểu thuộc tính> Tên property
{
get{return <tên thuộc tính>;}
set{<tên thuộc tính> = value;}
}
namespace IndexerProject
{
class Class1
{ class Program
private int[] iArray = new int[10]; {
public int this[int index] static void Main(string[] args)
{ { Console.WriteLine("Indexer Property");
get TruyCap();
{ if (index < 0 || index > 10) Console.ReadLine();
return 0; }
else static void TruyCap()
return iArray[index]; { Class1 cls = new Class1();
} for (int i = 0; i < 10; i++)
set cls[i] = i * 100;
{ if (!(index < 0 || index > 10)) for (int i = 0; i < 10; i++)
iArray[index] = value; Console.WriteLine("Element #{0} = {1}", i, cls[i]);
} }
} }
}
} 35
III. KẾ THỪA:
III.1 Khái niệm kế thừa:
Kế thừa (inheritance) là khái niệm khai báo một lớp như là một con cháu
của một lớp khác. Lớp cho phép lớp khác kế thừa được gọi là lớp cơ sở
(base) lớp đang kế thừa lớp khác thì gọi là lớp dẫn xuất (derive). Nhờ sự
thừa kế mà lớp dẫn xuất có thể sử dụng lại những thuộc tính và phương
thức của lớp cơ sở.
A A
B
A: Là trường hợp tổng quát của B B C
B: Là trường hợp đặc biệt của A
A: Là trường hợp tổng quát của B và C
B, C: Là trường hợp đặc biệt của A
36
III. KẾ THỪA:
III.1 Khái niệm kế thừa:
CNGUOI
37
III. KẾ THỪA:
III.1 Khái niệm kế thừa:
• Kế thừa từ các lớp có từ trước.
• Ích lợi: có thể tận dụng lại
– Các thuộc tính chung
– Các hàm có thao tác tương tự
39
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
Ví dụ viết chương trình nhập xuất nhân viên, biết rằng gồm 2 loại nhân viên:
Nhân viên biên chế và nhân viên hợp đồng. Thông tin của nhân viên gồm: mã
số, Họ tên.
•Nhân viên biên chế có thông tin riêng là bậc lương.
•Nhân viên hợp đồng có thông tin riêng là số giờ làm.
CNHANVIEN
CBIENCHE CHOPDONG
40
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
class CNHANVIEN
{
protected int maso;
protected string hoten;
public CNHANVIEN()
{
maso = 0; hoten = "";
}
public void Nhap()
{
Console.Write("Nhap ma so nhan vien: ");
maso = int.Parse(Console.ReadLine());
Console.Write("Nhap ho ten nhan vien: ");
hoten = Console.ReadLine();
}
public void Xuat()
{
Console.WriteLine("Ma so: {0}\nHo ten: {1}", maso, hoten);
}
} 41
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
class CBIENCHE : CNHANVIEN
{
private float hesoluong;
public CBIENCHE(): base()
{
hesoluong = 0;
}
public new void Nhap()
{
base.Nhap();
Console.Write("Nhap he so luong: ");
hesoluong = float.Parse(Console.ReadLine());
}
public new void Xuat()
{
base.Xuat();
Console.WriteLine("He so luong: " + hesoluong);
}
} 42
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa new và base:
class Program
class CHOPDONG : CNHANVIEN
{
{ static void Main(string[] args)
private float sogio; {
CBIENCHE nvbc = new CBIENCHE();
public CHOPDONG() : base()
nvbc.Nhap();
{ CHOPDONG nvhd = new CHOPDONG();
sogio = 0; nvhd.Nhap();
Console.WriteLine("\nNhan vien bien che");
}
nvbc.Xuat();
public new void Nhap() Console.WriteLine("\nNhan vien hop dong");
{ nvhd.Xuat();
}
base.Nhap();
}
Console.Write("Nhap so gio lam viec: ");
sogio = float.Parse(Console.ReadLine());
}
public new void Xuat()
{
base.Xuat();
Console.WriteLine("So gio lam viec: " + sogio);
}
} 43
III. KẾ THỪA:
III.2 Kế thừa bằng từ khóa virtual và overwrite:
class COSO
{
protected kiểu data1;
protected kiểu data2;
public virtual void Method1() {…}
public virtual void Method2() {…}
}
class DANXUAT : COSO
{
private kiểu data3;
public override void Method1() {…}
public override void Method2() {…}
}
44
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.1 Lớp trừu tượng (abstract class):
Lớp trừu tượng chỉ thiết lập một cơ sở cho các lớp kế thừa. Lớp
trừu tượng không thể có bất kỳ một thể hiện nào tồn tại. Phương
thức abstract trong lớp trừu tượng là phương thức chỉ có tên thôi
và nó phải được cài đặt lại ở tất các các lớp kế thừa.
45
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.1 Lớp trừu tượng (abstract class):
abstract class Window
{
protected int top, left;
public Window(int top, int left)
class ListBox : Window
{
{
this.top = top; this.left = left; private string listBoxContents;
} public ListBox(int top, int left, string
abstract public void DrawWindow( ); contents) :
} base(top, left)
{
listBoxContents = contents;
}
public override void DrawWindow( )
{
Console.WriteLine("Writing string to
the listbox: {0}",
listBoxContents);
}
}
46
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.2 Interface (giao diện):
- Interface thì tương tự như lớp trừu tượng, nhưng interface chỉ chứa
định nghĩa của các phương thức, property, delegate.
- Không cho phép chỉ định tầm vực khi định nghĩa các thành viên trong
Interface.
- Interface có thể kế thừa từ một hay nhiều Interface cơ sở khác.
- Một một lớp nào đó kế thừa Interface thì phải cài đặt phần thân cho tất
cả các thành viên đã khai báo trong Interface.
- C# cho phép một lớp dẫn xuất đa kế thừa nhiều Inteface.
47
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.2 Interface (giao diện):
Ví dụ: namespace InterfaceProject
{
interface IDatabases
{
string SQL
{
get;
set;
}
string Error
{
get;
}
DataTable GetDataTable();
int ExecuteSQL();
void ExecuteSQL(ref object value);
}
}
48
IV. LỚP TRỪU TƯỢNG VÀ INTERFACE:
IV.3 Từ khóa partial
- Đối với C# 2005 thì ta có thể khai báo một lớp, cấu trúc struct, hay Interface
trên nhiều tập tin bằng cách sử dụng từ khóa partial thay vì phải trân một tập tin
như ta thường làm trong các phiên bản trước.
- Mỗi tập tin chứa đựng toàn bộ hay một phần của lớp, khi biên dịch chúng sẽ
được kết hợp thành một. Điều này cho phép ta có thể phân chia lớp ra thành
nhiều phần, mỗi phần giao cho một nhóm lập trình viên thực hiện khi họ cùng
làm việc trên một dự án lớn.
trong tập tin Class1.cs
using System;
trong tập tin Class2.cs
namespace PartialClassProject
using System;
{
namespace PartialClassProject
partial class clsCommon
{
{
partial class clsCommon
int i = 10;
{
int j = 20;
public int multiple()
public int sum()
{
{
return i * j;
return i + j;
}
}
}
}
}
} 49
50