Nếu namespace không được xác định => sử dụng namespace mặc định Namespace có thể chứa struct, interface, delegate và enum Namespace có thể được sử dụng ở các file khác Trường h
Trang 1Lập trình C# (Sharp)
GV: Hồ Văn Lâm Khoa Tin học, ĐH Quy Nhơn
Trang 4.NET Platform
– Tập hợp các ngôn ngữ lập trình (C#, VB.NET), tập hợp các công cụ phát triển (Visual Studio NET), thư viện các class
và Common Language Runtime (CLR)
– Tập hợp các NET Enterprise Servers (SQL Server 2005, Exchange 2005, BizTalk 2005 …)
– Web Service: cho phép sử dụng các service này để xây dựng những ứng dụng như bảo mật, xác định người sử dụng …
– Hỗ trợ các thiết bị không phải là máy tính như điện thoại di động, máy chơi điện tử …
Trang 52 .NET Framework
các thành phần đều phải tuân theo
interface, delegate, kiểu tham chiếu và kiểu giá trị
Có CLS (Common Language Specification) - cung cấp các quy tắc phục vụ cho việc tích hợp ngôn ngữ
các đối tượng có thể thao tác với nhau
bộ thư viện FCL (Framework Class Library)
Trang 6Các thành phần của NET Framework
4 ngôn ngữ chuẩn: C#, VB.NET, Managed C++, và JScript NET
CLR (Common Language Runtime)
Trang 7Kiến trúc của NET Framework
Trang 83 Dịch chương trình
thành IL (Microsoft Intermediate Language)
– IL được lưu trên 1 file trong ổ đĩa
– File IL do C# tạo ra cũng tương tự như file IL do các ngôn ngữ NET khác tạo ra
cách sử dụng chương trình dịch JIT (Just In Time )
Kết quả là tạo ra mã máy bởi Common Language
Runtime (CLR), được thực hiện bởi bộ xử lý
– Trình dịch JIT sẽ đọc từng lệnh trong file IL, dịch ra mã máy, sau đó yêu cầu bộ xử lý sẽ thực hiện luôn và còn JIT quay lại tiếp tục thực hiện với lệnh kế tiếp
Trang 93 Dịch chương trình
Trang 10 File Hello.cs
Bổ sung namespace System
Chương trình bắt đầu thực hiện từ hàm Main
In ra màn hình
Trang 11 Nếu namespace không được xác
định => sử dụng namespace mặc định
Namespace có thể chứa struct,
interface, delegate và enum
Namespace có thể được sử dụng ở
các file khác
Trường hợp đơn giản nhất: Một lớp,
một file, và chỉ sử dụng namespace mặc định
Cấu trúc của một chương trình
• Câu lệnh C# được kết thúc bởi một dấu chấm phẩy (;).
• Nhiều câu lệnh có thể gộp thành một khối được bao ở hai đầu bởi cặp dấu
ngoặc nghéo { },
• Câu lệnh nếu dài có thể tiếp tục xuống hàng dưới không cần đến một ký tự
Trang 12Chương 2:
Căn bản C#
Trang 13Biến và kiểu dữ liệu
– Là một khoảng không gian trong bộ nhớ máy tính được dành ra để lưu trữ một giá trị
– Tên của biến được dùng để tham chiếu đến giá trị
– Khai báo biến là báo cho máy dành ra một vùng nhớ để lưu một kiểu dữ liệu:
– Cú pháp khai báo biến:
[ modifier ] datatype identifer ;
– Ví dụ: int a; public float b;
– Phạm vi hoạt động của biến là đoạn chương trình mà biến được khai báo, trong một đoạn chương trình không được khai báo hai biến trùng tên nhau
Trang 14kiểu dữ liệu
C# là một ngôn ngữ được kiểm soát chặt chẻ về mặt kiểu dữ liệu, phân biệt chữ hoa chữ thường
– Value Type - Kiểu dữ liệu cơ bản: kiểu dữ liệu khác lớp đối tượng
– Reference Type - Kiểu tham chiếu: kiểu dữ liệu là lớp đối tượng
Kiểu số nguyên
Name CTS Type Description Range (min:max)
byte System.Byte 8-bit signed integer 0:255 (0:2 8 -1)
ushort System.UInt16 16-bit signed integer 0:65,535 (0:2 16 -1)
uint System.UInt32 32-bit signed integer 0:4,294,967,295 (0:2 32 -1)
Trang 15kiểu dữ liệu
Kiểu số nguyên
sbyte System.SByte 8-bit signed integer -128:127 (-2 7 :2 7 -1)
short System.Int16 16-bit signed integer -32,768:32,767 (-2 15 :2 15 -1)
int System.Int32 32-bit signed integer -2,147,483,648:2,147,483,647 (-21) 31:231long System.Int64 64-bit signed integer -9,223,372,036,854,775,808: 9,223,372,036,854,775,807 (-263:263-1)
Trang 16-kiểu dữ liệu
Kiểu số thực
Float System.Single 32-bit single-precision floating- point ±1.5 × 101038 -45 to ±3.4 ×
Double System.Double 64-bit double-precision floating- point ±5.0 × 1010308 -324 to ±1.7 ×
decimal System.Decimal 128-bit high precision decimal notation ±1.0 × 101028 -28 to ±7.9 ×
Trang 17 Thường thì phải khởi gán một biến chuỗi:
string myString = "Xin chao“;
char System.Char Represents a single 16-bit (Unicode) character
Trang 18Biến và kiểu dữ liệu
Trang 19Reference Type
Lớp đối tượng Object (System.Object): là lớp trừu tượng, là lớp cha của tất cả các lớp Khi định nghĩa một lớp A Mặc nhiên A sẽ lấy
Object làm lớp cha.
Reference Type:
Trang 20– Hằng bắt buộc phải được gán giá trị lúc khai báo.
– Trị của hằng phải có thể được tính toán vào lúc biên dịch, không thể gán một hằng từ một trị của một biến Nếu muốn làm thế thì phải sử dụng đến một read-only field.
– Hằng bao giờ cũng static, tuy nhiên ta không thể đưa từ khoá static vào khi khai báo hằng
Có ba thuận lợi khi sử dụng hằng trong chương trình:
– Hằng làm cho chương trình đọc dễ dàng hơn,
– Hằng làm cho dễ sữa chương trình hơn.
Trang 22Phép toán và biểu thức
> >= < <= == !=
x >= 5 a==b
a != 7
&& || !
x>5 && x <10 x<5 || x >10
3<10 -> true !(3<10) -> false
Trang 23Toán tử
Trang 24Toán tử
Bảng mô tả cách viết tắt của các phép toán
Trang 27An toàn kiểu (Type Safety)
Bảng chuyển đổi kiểu ngầm định trong C#
Trang 28Boxing and Unboxing
Boxing là từ dùng để chỉ quá trình chuyển đổi từ một kiểu giá trị sang kiểu tham khảo và tương tự Unboxing thì ngược lại
Ví dụ sau đây sử dụng Boxing:
Trang 29Boxing and Unboxing
tượng object được chuyển thành j kiểu int.
Trang 30Phép toán và biểu thức
3 logic
2
So sánh
1
Số học
Nhân chia trước cộng trừ sau
Từ trái sang phải
3
Or (||)
2 And (&&)
1 Not (!)
Trang 32Console I/O
Trang 34Biểu thức điều kiện if
Câu lệnh if hoặc if else: Để kiểm tra điều kiện trước khi thực hiện công việc.
Cú pháp:
if(điều_kiện) {
//thực hiện công việc
}
Trang 35Câu lệnh if hoặc if else
Câu lệnh if hoặc if else :
Trang 36Câu lệnh switch case
Câu lệnh switch case : Khi công việc có nhiều lựa chọn và tuỳ
vào từng trường hợp để đưa ra công việc phù hợp với điều kiện
đưa vào có thể dùng câu lệnh switch case.
case 1: Console.WriteLine("integerA =1"); break;
case 2: Console.WriteLine("integerA =2"); break;
case 3: Console.WriteLine("integerA =3"); break;
default: Console.WriteLine("integerA is not 1,2, or 3");
Trang 40}
Trang 43Mảng (Array)
Array là một cấu trúc dữ liệu cấu tạo bởi một số biến được gọi là những phần tử mảng Tất cả các phần tử này đều thuộc một kiểu dữ liệu Có thể truy xuất phần tử thông qua chỉ số (index) Chỉ số bắt đầu bằng zero.
Có nhiều loại mảng (array): mảng một chiều, mảng nhiều chiều.
Trang 44Mảng (Array)
như sau:
myIntegers = new int[32];
integers[0] = 35;// phần tử đầu tiên có giá trị 35
integers[31] = 432;// phần tử 32 có giá trị 432
int[] integers;
integers = new int[32];
string[] myArray = {"first element", "second element", "third element"};
Trang 45Mảng (Array)
Làm việc với mảng (Working with Arrays)
Chiều dài của mảng :
int arrayLength = integers.Length
Thành phần của mảng là kiểu định nghĩa trước (predefined types), sắp xếp tăng dần dựa vào phương thức static
Array.Sort() method: Array.Sort(myArray);
Đảo ngược mảng đã có nhờ vào static Reverse() method:
Trang 46Mảng nhiều chiều (Multidimensional
Arrays in C#)
Cú pháp :
type[,] array-name;
Thí dụ:
hàng ba cột với phần tử kiểu nguyên:
int[,] myRectArray = new int[2,3];
int[,] myRectArray = new int[,]{ {1,2},{3,4},{5,6}, {7,8}}; mảng 4 hàng 2 cột
Trang 47Mảng jagged
với kích thước khác nhau Những mảng con này phải đuợc khai báo từng mảng con một.
nghĩa là hai cặp [], gồm 3 hàng mỗi hàng là một mảng một chiều:
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[3];
a[2] = new int[1];
Trang 48gồm một tập hợp những hằng đuợc đặt tên.
public enum TimeOfDay
Trang 49 Ví dụ sau sử dụng enumeration:
class EnumExample
{ public enum TimeOfDay {
Morning = 0, Afternoon = 1, Evening = 2
} public static int Main() {
WriteGreeting(TimeOfDay.Morning);
return 0;
}
Trang 50static void WriteGreeting(TimeOfDay timeOfDay)
{ switch(timeOfDay) {
Trang 51giữa các lớp và các kiểu khác.
tên biến, tên hàm đụng độ vì trùng tên giữa các lớp namespace CustomerPhoneBookApp
Trang 52namespace Basics {
}
Trang 53public static int Main()
{
Basics.NamespaceExample NSEx = new Basics.NamespaceExample();
return 0;
} }
Trang 55{ Introduction.NamespaceExample NSEx = new Introduction.NamespaceExample();
Console.WriteLine(NSEx.GetNamespace()); return 0;
} }
Trang 56public string GetNamespace() {
return this.GetType().Namespace; }
} }
Trang 57Phương thức Main()
biên dịch, theo mặc định trình biên dịch nhìn vào phương thức Main()
dịch sẽ trả về thông báo lỗi
được xem là điểm đột nhập vào chương trình
Trang 59Khai báo hàm main() nhận thông
số (Passing Arguments to Main())
{ for (int i = 0; i < args.Length; i++)
{ Console.WriteLine(args[i]);
} return 0;
} }
}
Trang 60Khai báo hàm main() nhận thông
số (Passing Arguments to Main())
Chạy chương trình bạn nhớ nhập thêm thông số, Bạn nên chạy bằng công cụ hỗ trợ của NET kết quả như sau:
ArgsExample /a /b /c
/a /b /c
Trang 61spans multiple lines */
Console.WriteLine(/* Please don't do this! */ "This will compile");
DoSomething(Width, /*Height*/ 100); string s = "/* This is
Trang 62Chương 3
C# hướng đối tượng
Trong chương này sẽ được tiếp xúc một số khái niệm về hướng đối tượng trong C#
Trang 63Chương 3
C# hướng đối tượng – Lớp và kế thừa
thuộc tính và phương thức
class MyClass
{
private int someField;
public string SomeMethod(bool parameter)
{ } }
Trang 64Chương 3
C# hướng đối tượng – Lớp và kế thừa
thuật ngữ(term) dùng để chỉ đến một dữ liệu hay một chức năng nào đó được định nghĩa trong lớp đó
thành viên chứa mã như các phương thức(methods), các thuộc tính(properties), constructor, hay các nạp chồng toán hạng(Operator Overloads).
Trang 65Chương 3
C# hướng đối tượng – Lớp và kế thừa
Ví dụ tạo lớp sinhvien sau:
Class Sinhvien
{ private string ten;
private string lop;
public string Ten {
get
{ return ten; } set
{ ten=value;}
} public void xuatthongtin()
Console.WriteLine(“Ten sinh vien {0}”, ten);
Console.WriteLine(“Hoc lop {0}”, lop);
} }
Trang 66Chương 3
C# hướng đối tượng – Lớp và kế thừa
khi khai báo một kiểu lớp thì có một biến lưu trữ tham khảo đến một thể hiện (instance) của lớp đó và sử dụng
lệnh new để tạo ra một đối tượng.
Ví dụ tạo ra đối tượng myObject như sau:
MyClass myObject;
myObject = new MyClass();
Tuy nhiên có thể khai báo và khởi tạo đối tượng cùng một lúc
MyClass myObject = new MyClass();
Ví dụ tạo đối tượng a thuộc lớp Sinhvien
Trang 67Chương 3
C# hướng đối tượng- Đơn thừa kế
hưởng những thuộc tính và phương thức từ một lớp khác
class MyDerivedClass : MyBaseClass
{ // functions and data members here }
đó C# hỗ trợ một lớp cơ sở toàn diện gọi là
System.Object.
Trang 68Chương 3
C# hướng đối tượng- Đơn thừa kế
Ví dụ:Xây dựng lớp Sinhvien và lớp Congnhan kế thừa từ lớp Connguoi.
class Connguoi
{
private string ten;
private int tuoi;
… }
class Sinhvien: Connguoi
{
private string lop;
… }
class Congnhan: Connguoi
{
private string tencongty;
…
Trang 69Chương 3
C# hướng đối tượng - Phương thức nạp chồng(Overloading)
phương thức khác nhau về những đặc tính sau: tên,
số lượng thông số, và kiểu thông số
C++ và VB
cùng tên nhưng khác số lượng và kiểu của thông số:
Trang 70void DisplayResult(int result)
{
// implementation }
}
Trang 71Chương 3
C# hướng đối tượng - Phương thức nạp chồng(Overloading)
về kiểu trả về
về đặc tính của một thông số đang được khai báo
như ref hay out
Trang 72Chương 3
C# hướng đối tượng - Phương thức Overriden và Hide
Bằng cách khai báo virtual trong một hàm ở lớp cơ sở thì cho
phép hàm đó được overriden trong bất kỳ một lớp thừa hưởng nào
Trang 73Chương 3
C# hướng đối tượng - Phương thức Overriden và Hide
class MyDerivedClass : MyBaseClass
Những trường thành viên (member fields) và những hàm
tĩnh thì không được khai báo Virtual.
Trang 74Chương 3
C # hướng đối tượng - Phương thức Overriden và Hide
khai báo ở lớp cơ sở và lớp thừa hưởng nhưng các
phương thức này không khai báo virtual hay overriden thì sẽ được gọi là: "lớp thừa hưởng hide lớp cơ sở
đó"
kiểu của biến được sử dụng để tham khảo đến thể hiện, chứ không phải kiểu của chính thể hiện đó.
cả lớp thừa hưởng và lớp cơ sở mà không có khai báo
virtual và override thì sẽ bị cảnh báo trong khi biên
dịch Trong C#, nên sử dụng từ khoá new để đảm bảo bạn muốn hide phương thức đó
Trang 75Chương 3
C # hướng đối tượng - Phương thức Overriden và Hide
Trong C# có một cú pháp đặc biệt để gọi những phiên bản cơ sở của một phương thức từ một lớp thừa hưởng Cú pháp :
base.<methodname>()
Ví dụ:
class CustomerAccount
{ public virtual decimal CalculatePrice() {
// implementation }
} class GoldAccount : CustomerAccount {
public override decimal CalculatePrice() {
return base.CalculatePrice() * 0.9;
}
Trang 76Chương 3
C# hướng đối tượng - lớp và hàm Abstract
C# cho phép cả lớp và phương thức có thể khai báo abstract
Một lớp abstract không được thể hiện và một phương thức abstract không được thực thi mà phải được overriden trong bất kỳ lớp thừa hưởng không abstract nào
Một phương thức abstract sẽ tự động được khai báo virtual Nếu
một lớp có phương thức abstract thì nó cũng là lớp abstract và được khai báo như sau:
abstract class Building
{ public abstract decimal CalculateHeatingCost(); // abstract method
}
Trang 77Chương 3
C# hướng đối tượng - Sealed các lớp và phương thức
C# cho phép các lớp và phương thức được khai báo sealed Nếu
là lớp có nghĩa là không được quyền thừa kế lớp đó, nếu là phương thức tức là không được phép override nó
C# sử dụng từ khoá sealed trước tên lớp và phương thức:
sealed class FinalClass
{
// etc}
class DerivedClass : FinalClass // wrong Will give compilation error {
// etc }
Trang 78class DerivedClass : MyClass
{
public override void FinalMethod() // wrong Will give compilation error
{ } }
Trang 79Chương 3
C# hướng đối tượng – Những Bổ Từ Truy cập
Trong C# cung cấp các bổ từ để cho biết sự tồn tại của một thành viên một lớp Có 5 bổ ngữ như sau:
public Biến và phương thức có thể được truy cập từ bất kỳ nơi đâu.
Internal Biến và phương thức chỉ có thể được truy cập trong cùng một
gói Protected Biến hay phương thức chỉ có thể được truy cập từ kiểu của nó
hay từ những kiểu kế thừa kiểu đó.
Protected internal Biến hay phương thức chỉ có thể được truy cập từ gói hiện tại,
hay từ những kiểu kế thừa hiện tại.
private Biến hay phương thức chỉ có thể truy cập từ trong kiểu của nó
Trang 80Chương 3
C# hướng đối tượng – Thuộc Tính
Để định nghĩa thuộc tính trong C# dùng cú pháp sau:
public string SomeProperty
{
// do whatever needs to be done to set the property
} }
Trang 81Chương 3
C# hướng đối tượng – Thuộc Tính
Thủ tục get không có tham số và phải trả về cùng kiểu với thuộc tính đã được khai báo
Không nên khai báo tường minh các tham số trong thủ tục set, mà trình biên dịch sẽ tự động
biết là có một tham số cùng kiểu trỏ đến giá trị
Ví dụ:
private string foreName;
public string ForeName
Trang 82trong khai bao thuộc tính đó.
Ví dụ để định nghĩa thuộc tính Forename là chỉ đọc:
private string foreName;
public string ForeName
Trang 83Chương 3
C# hướng đối tượng – Thuộc Tính
Bổ từ truy cập:
C# không cho phép cài đặt những bổ từ khác nhau cho thủ tục set và get Nếu muốn tạo ra một
thuộc tính có public để đọc nhưng lại muốn hạn chế protected trong gán thì đầu tiên phải tạo
thuộc tính chỉ đọc với bổ từ public sau đó tạo một hàm set() với bổ từ protected ở bên ngoài
protected void SetForeName(string value)