Kiến trúc của .NET Framework•FCLFramework Class Library là thư viện kiểu dữ liệu có thể tái sử dụng gồm các class, structure, … dành cho các ứng dụng thực thi trong .NET.. Các bước thực
Trang 2CHƯƠNG I
Trang 3Giới thiệu
• NET Framework là môi trường tích hợp để đơn giản hóa việc phát triển và thực thi các ứng dụng trên Internet, desktop và các thiết bị di động
Trang 4Kiến trúc của NET Framework
Trang 5Kiến trúc của NET Framework
thực thi mã lệnh và tất cả các tác vụ liên quan đến nó: biên dịch, quản lý bộ nhớ, bảo mật, quản lý tuyến đoạn.
Mã lệnh thực thi trong CLR chia làm 2 loại:
- mã được quản lý
- mã không được quản lý là mã lệnh không cài đặt
những yêu cầu để thực thi trong CLR – chẳng hạn như COM hoặc các thành phần dựa trên Windows API
Trang 6Kiến trúc của NET Framework
•FCL(Framework Class Library ) là thư viện kiểu dữ liệu có thể tái sử dụng (gồm các class, structure, …) dành cho các ứng dụng thực thi trong NET
•Tất cả các ngôn ngữ hỗ trợ NET Framework đều sử dụng thư viện lớp dùng chung này
Trang 7Các bước thực hiện của Ct
Code Executed
R U N T I M E
Trang 8Các bước thực hiện của Ct
truyền thống
• Các ngôn ngữ trước đây có chương trình dịch riêng và có môi trường chạy riêng của nó
• Trong NET, chương trình dịch dịch mã nguồn vào một "Intermediate Language (IL)“ và runtime được thay thế bởi CLR (Common Language Runtime)
Trang 9Các bước thực hiện của các ct NET
MSIL + Metadata
CLR Machine
code
Code executed
C ác chương trình NET được dịch 2 lần: lần đầu chậm, lần thứ 2 tương
đối nhanh hơn.
Trang 10Các bước thực hiện của các ct NET
• Chương trình nguồn trước hết sẽ được biên dịch và đóng gói thành một khối gọi là assembly (là tập hợp các thành phần được đóng gói trong file exe hoặc dll) Khối này sẽ chứa các mã lệnh ngôn ngữ trung gian (IL) và các metadata mô tả thông tin cần thiết cho sự hoạt động của khối.
• Mỗi khi có yêu cầu thực thi assembly nói trên,
CLR sẽ dùng trình biên dịch JIT (Just-in-Time) của môi trường thực thi để chuyển đối IL chứa trong nó sang dạng mã lệnh cụ thể của máy khi
ứng dụng thực sự thực thi.
Trang 11Các bước thực hiện của các ct NET
Trang 12Các kiểu dữ liệu cơ sở của CTS
Trang 14Nội dung
• Giới thiệu
• Môi trượng soạn thảo và chạy
• Biến và các kiểu dữ liệu
• Các cấu trúc điều khiển: if, switch
• Các cấu trúc lặp; for, while, do while, foreach
• Mảng, ArrayList, File văn bản
• Bài thực hành
Trang 16GIỚI THIỆU VỀ C#
- “bài toán” cần giải quyết là một solution
- Một solution bao gồm một hoặc nhiều project
- Một solution, nếu có nhiều project thì nên được tạo ra trong một thư mục riêng để có thể chứa các project trong nó
Trang 17Cú pháp đơn giản của 1 Project
Trang 18Dịch và chạy 1 chương trình C# trên Console
• Soạn mã: Người sử dụng có thể dùng bất kỳ trình soạn thảo nào như:
– Notepad
– Microsoft Visual Studio
– ….
• Lưu lại thành file có phần mở rộng cs
• Start|Programs|Microsoft NET Framework SDK v2.0|SDK Command Prompt
– Gõ csc [ổ đĩa:]\[ đường dẫn]\<tên file cs> cần dịch
– Gõ tên file cần chạy
Trang 19Ví dụ chương trình đơn giản
Trang 20Sử dụng IDE Microsoft Visual Studio 2005
• Khởi động Microsoft Visual Studio 2005 File
New Project để tạo mới một project
Trang 21• Khai báo theo cú pháp:
Mức truy cập Kiểu Tên biến
public
protected private
int string
Trang 22Các kiểu số nguyên
Tên Kiểu trong
CTS Mô tả Vùng biểu diễn (min:max) sbyte System.SByte Số nguyên có dấu 8-bit -2 7 :2 7 -1
short System.Int16 Số nguyên có dấu 16-bit -2 15 :2 15 -1
int System.Int32 Số nguyên có dấu 32-bit -2 31 :2 31 -1
long System.Int64 Số nguyên có dấu 64-bit -2 63 :2 63 -1
byte System.Byte Số nguyên không dấu 8-bit 0:2 8 -1
ushort System.UInt16 Số nguyên không dấu
Trang 23Kiểu số thực, Boolean, ký tự
• Kiểu số thực: float, double
• Kiểu Boolean: bool: true|false
• Kiểu ký tự: char
– Biểu diễn 1 ký tự 16-bit (Unicode) Các hằng kiểu ký tự được gán bằng cách đóng trong cặp dấu nháy đơn, ví dụ 'A'
Trang 24Kiễu dữ liệu tham chiếu được định nghĩa sẵn
object System.Object Kiểu dữ liệu gốc, mọi kiểu dữ liệu khác
trong CTS đều kế thừa từ đây (kể cả các kiểu dữ liệu giá trị)
string System.String Chuỗi ký tự Unicode
Trang 26Indexing (cho array và các indexers) []
Thông tin về kiểu Sizeof(Kiểu)
Điều khiển Overflow exception checked unchecked
Trang 27Luồng điều khiển của chương trình
Trang 29Console WriteLine ( "less than 10" );
Trang 30Câu lệnh 2;
break ;
case n :
Câu lệnh n;
break ; [ default :
Câu lệnh n+1;
break;
] }
Trang 31Console WriteLine ( "another value" );
break;
}
Trang 32
dsbt 2
T
F
Trang 33Console WriteLine ( s );
}
}
Trang 34C âu lệnh For [2]
Phạm vi của biến đếm: chỉ có tác dụng trong vòng lặp
using System ;//V í dụ lỗi
s += i ; }
Console.WriteLine(i); //Error statement
Console WriteLine ( s );
} }
Trang 38Câu lệnh doclass Test
Trang 39Cú pháp của for each
Trang 41string SubString( int vt , int n)
int IndexOf( string s)
int LastIndexOf( string s)
int CompareTo( string s)
bool Equals ( string s)
bool Contains( string s)
string Replace ( string chuoicu, string chuoimoi)
string Remove( int vt , int n)
Trang 42Các phương thức trên chuỗi
using System;
class ThaoTacTrenString
{ static void Main(string[] args)
{ string st1= " Nguyen Anh Trung ";
string st2 = "le Tien Tang";
st1 = st1.Trim();
Console.Write( "Chieu dai chuoi la {0}:\n", st1.Length); Console.WriteLine( "Ky tu tai chi so thu 3 la {0}", st1[3]); string ten1=st1.Substring(st1.LastIndexOf(' ')+1);
string ten2 = st2.Substring(st2.LastIndexOf( " ")+1,
st2.Length - st2.LastIndexOf(" ")-1);
Console.WriteLine( "Ten2=ten1:{0}",ten2.Equals(ten1));
Console.WriteLine( "so sanh ten1 voi ten 2: {0}",
ten1.CompareTo(ten2));
Console.ReadLine();
}
}
Trang 43Các phương thức trên chuỗi
using System;
class ThaoTacTrenString
{
static void Main(string[] args)
{ string st1= "Nguyen Anh Trung ";
Console.WriteLine( "Tim chuoi con {0}", st1.Contains("yen")); st1=st1.Replace("Nguyen", "Le");
} ….
Trang 45Console WriteLine ( students [ i ]); }
}
}
Trang 46int [][] a = new int [ 5 ][];
for ( int i = 0 ; i < a Length ; i ++) {
a [ i ] = new int [ i + 1 ];
for ( int j = 0 ; j < i + 1 ; j ++) {
a [ i ][ j ] = j ; }
}
Trang 47Console WriteLine ();
} }
}
Trang 49Khởi tạo mảng 1 chiều [6]
Trang 50Khởi tạo mảng 2 chiều [7]
int [,] b = new int [ 2 , 3 ] {{ 1 , 2 , 3 },{ 4 , 5 , 6 }};
foreach ( int i in b ) {
Console WriteLine ( i );
}
Trang 51Khởi tạo mảng jagged [8]
//jagged array
int [][] c = new int [ 2 ][]
{ new int [ 2 ] { 0 , 1 }, new int [ 3 ] { 2 , 3 , 4 }};
for ( int i = 0 ; i < c Length ; i ++)
for ( int j = 0 ; j < c [ i ] Length ; j ++) {
Console WriteLine ( c [ i ][ j ]);
}
}
}
Trang 52• Là mảng động, mỗi phần tử là một object
• Namespace: System.Collections
• Khai báo:
ArrayList <tenmang> = new ArrayList();
ArrayList <tenmang> = new ArrayList(Số phần tử);
Trang 53Các phương thức trên ArrayList
• Add(object): Chèn thêm 1 phần tử vào cuối
mảng
• Clear(): Xoá tất cả các phần tử
• Contains(object): Tìm object trong mảng
• IndexOf(object): Tìm chỉ số của object trong
mảng (-1)
• RemoveAt(index): Xoá phần tử thứ index
• Thuộc tính: count: cho biết số phần tử trong
mảng
• …
Trang 54ArrayList a = new ArrayList();
a.Add( "main");a.Add('m');a.Add(5);a.Add( DateTime.Now); test t = new test(); a.Add(t);
Trang 55Thao tác trên File
• Namespace: System.IO;
• Các đối tượng thao tác trên File: Stream,
StreamReader, StreamWriter, FileStream.
• Thao tác trên file văn bản: StreamReader,
StreamWriter.
• Mở file văn bản để đọc:
StreamReader <tênbiến> = new StreamReader(“dd"[,Encoding]);
• Mở file văn bản để ghi:
StreamWriter <tênbiến> = new StreamWriter (“dd“[, bool append] [,Encoding])
Trang 56Các phương thức trên StreamReader
• Close(): đóng file
• Peek(): Trả về ký tự tiếp theo, -1;:EOF
• Read(): Đọc ký tự tiếp theo
• ReadBlock(…): Đọc dãy các byte
• ReadLine(): Đọc 1 dòng
• ReadToEnd(): Đọc hết file
• …
Trang 57Các phương thức trên StreamWriter
• Close(): đóng file
• Write
• WriteLine: ghi file
static void Main(string[] args)
Trang 59Bài tập thực hành
• Thực hành các bài 1,2,3,4,5 trong giáo trình
• Giải pt bằng Gaussian:
– Vào ma trận hệ số A, vector B
– Giải thuật để chuyển ma trận về tam giác trên:
for(i = 0; i < n-1; i++)/* Trừ hàng đầu tiên */
Trang 60Bài tập thực hành về ArrrayList
• Nhập vào danh sách họ tên và đtb của 1 lớp, số lượng
sv không hạn chế, quá trình nhập dừng khi nhập họ tên rỗng:
Ht1 đtb1 Ht2 dtb2 … …
• Hiển thị họ tên và Đtb của các sinh viên lên lớp
•Nhập vào 1 họ tên, tìm xem có sv nào có họ tên này hay không
•Tính Trung bình cộng của ĐTB
•Xoá các sinh viên có đtb ra khỏi mảng
Trang 65protected Biến hoặc phương thức chỉ có thể truy xuất từ bên
trong kiểu dữ liệu mà nó thuộc về, hoặc các kiểu dữ liệu dẫn xuất
protected
internal Biến hoặc phương thức có thể được truy xuất trong phạm vi assembly hiện tại, hoặc từ các kiểu dữ liệu
dẫn xuất từ kiểu dữ liệu chứa nó
private Biến hoặc phương thức chỉ có thể được truy xuất từ
bên trong kiểu dữ liệu mà nó thuộc về
Trang 66Class_b t2 = new Class_b();
Class_b.Class_b1 t21 = new Class_b.Class_b1();
Class_b.Class_b2 t22= new Class_b.Class_b2(); }
}
Trang 67Hàm dựng (Constructors)
• Là một loại đặc biệt của phương thức trong một lớp
• Được gọi khi một lớp được tạo.
• Thường được sử dụng để khởi tạo các giá trị trong một lớp.
• Tên trùng với tên lớp
• Không trả về giá trị
• Nếu không tạo ra hàm dựng C# sẽ tạo ra hàm dựng ngầm định
• Một lớp có thể có nhiều hàm dựng nhưng khác nhau
về số lượng hoặc kiểu của tham số
Trang 68Ví d v ụ về ề Constructors
using System;
public class Person
{
string Ten,dc=“Khong co” ;
public Person ( string Ten )
}
Trang 70Private Constructors
• Được sử dụng khi một lớp chỉ có các thành viên tĩnh và lớp không cần phải tạo ra.
public class MathConstant
// MathConstant m = new MathConstant();
Console WriteLine ( MathConstant Pi );
}
}
Trang 71Static Constructors
• Được gọi tự động (chỉ 1 lần) trước khi thực thể đầu tiên của đối tượng được tạo hoặc các thành viên tĩnh được tham chiếu
• Không có tham số
Trang 72public class Bus
{
static Bus() // Static constructor:
{ System Console.WriteLine( "Ham tinh duoc goi"); }
public static void Drive()
{ System Console.WriteLine( "Phuong thuc Drive duoc goi"); } }
class TestBus
{ static void Main()
{ Bus.Drive();
Bus b = new Bus();
Bus c= new Bus(); }
}
Trang 73• Destructors trong C# gọi là bộ thu gom rác Garbage Collectors
• Bộ thu gom rác sẽ giải phóng bộ nhớ khi
đối tượng không còn yêu cầu hoặc tham
chiếu
• Destructors khai báo như sau:
~<tên hàm huỷ>()//giống tên lớp{
//các cài đặt của người lập trình}
Trang 74Các trường (Fields)
• Lưu trữ giá trị
• Cú pháp: <Mứctruycập> <Kiểu> <tênfields>
• Mức truy cập: public, private, protected,
internal, protected internal
• Kiểu:
– Kiểu giá trị được định nghĩa sẳn (int,char …)
– Kiểu tham chiếu: lớp, struct, mảng, chuỗi,….
Trang 75Ví dụ
namespace Vidu
{
class Class_Lop{ }
Public class SinhVien
{ public string hoten;
private bool GioiTinh;
protected DateTime NgaySinh;
internal float[] DsDiem = new
static void Main(string[] args) {
SinhVien sv = new SinhVien(); sv.hoten = "Nguyen Nam";
//sv.GioiTinh = false;
//sv.NgaySinh = DateTime.Parse("12/10/79"); sv.DsDiem[0] = 5;
} } }
Trang 76Trường tĩnh [1]
• Được khai báo trong 1 lớp
• Khi sử dụng không cần phải tạo ra lớp chứa trường tĩnh
• Khi khai báo chỉ cần dùng static trước tên biến
• Truy xuất: <tênlớp>.tên trường tĩnh
Trang 77Ví dụ trường tĩnh
using System ;
public class List
{
public static int Dem = 0 ;
public List ()//H àm dựng: được gọi khi tạo lớp {
Console WriteLine ( List Dem );
List n1 = new List (); n1.Dem Console WriteLine ( List Dem );
List n2 = new List ();
Console WriteLine ( List Dem );
}
}
Trang 78Trường chỉ đọc
• Sử dụng readonly khi khai báo
• Chỉ có thể gán giá trị khi khai báo hoặc trong hàm dựng class test
{
public readonly int a = 10;
public readonly int b;
Trang 79• Khai báo hàm dùng bổ từ const
• Không thể thay đổi giá trị của hằng
• Hằng sử dụng như trường tĩnh
Trang 80Ví d v ụ về ề Constants
using System ;
public class Gender
{
public const int male = 1 ;
public const int female = 2 ;
Console WriteLine ( "male = {0}" ,Gender male);
Console WriteLine ( "female = {1}" , Gender female ); }
}
Trang 81Phương thức(method)
• Là tập hợp các câu lệnh
• Được khai báo trong lớp hoặc cấu trúc, phải chỉ rõ mức truy cập, tên, kiểu trả về,danh sách các tham số Nếu không có tham số phải có cặp dấu ngoặc
• Phương thức không trả về giá trị có kiểu trả về là void
• Dùng return để trả về giá trị của phương thức
Trang 83Tham chi u ref and out [1] ếu ref and out [1]
public void GetPoint ( int x , int y )
{
x = this x ;
y = this y ; }
}
Trang 84Tham chi u ref and out [2] ếu ref and out [1]
class Test
{
public static void Main ()
{
int x = 0 ; //int x; > Error
int y = 0 ; //int y; > Error
Point p = new Point ( 100 , 200 );
Trang 85Tham chi u ref and out [3] ếu ref and out [1]
public void GetPoint ( ref int x , ref int y ) {
x = this x ;
y = this y ; }
}
Trang 86Tham chi u ref and out [4] ếu ref and out [1]
class Test
{
public static void Main ()
{
int x = 0 ; // int x; > Error
int y = 0; // int y; > Error
Point p = new Point ( 100 , 200 );
p GetPoint ( ref x , ref y );
Trang 87Tham chi u ref and out [5] ếu ref and out [1]
public void GetPoint ( out int x , out int y ) {
x = this x ;
y = this y ; }
}
Trang 88Tham chi u ref and out [6] ếu ref and out [1]
p GetPoint (out x ,out y );
•Không cần khởi tạo giá trị cho các tham số
•Khi xây dựng và gọi phương thức phải dùng out
Trang 89Danh sách các tham số có chiều dài thay đổi [1]
• C# cho phép khai báo 1 tham số nhưng khi gọi phương thức thì số lượng tham số có thể thay đổi
• Ví dụ như WriteLine(…)
• Sử dụng từ khoá params để khai báo tham
số có chiều dài thay đổi
Trang 90Variable-Length Parameter Lists [2]using System ;
public class MyClass
Trang 91Variable-Length Parameter Lists [3]
class Test
{
public static void Main ()
{
MyClass a = new MyClass ();
Console WriteLine ( a Sum ( 1 , 2 ));
Console WriteLine ( a Sum ( 1 , 2 , 3 ));
a Write ( "John Smith" , 100 );
}
}
6 John Smith 100
Trang 92• Xây dựng lớp Lop để:
– Xuất ra thông tin các SV
– In ra họ tên các sinh viên lên lớp
– Xây dựng hàm để tìm ĐTB cao nhất
– Xay dung ham: double Tk(String ht): : Ham tra ve dtb cua sv co ho ten =ht
Bài tập
Trang 94N ội dung
• Giới thiệu
• Hàm nạp chồng (Overloading)
• Hàm ghi đè (Overriding)
• Hàm ảo (Virtual Functions)
• Lớp trừu tượng (Abstract Classes)
• Lớp Sealed
• Giao diện
Trang 95class LopCon : LopCha
{ Cai dat lop con}
Trang 96Ví dụ về kế thừa [1]
using System ;
public class Person
{
protected string name ; //protected Field
public Person ( string name ) //Function as a Constructor {
this name = name ; }
public void SayName () //Member function
{
Console WriteLine ( "Person name is {0}" , name );
}
}