LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Bài 2 Các kiểu dữ liệu-Khai báo biến
Nội dung
- Các kiểu dữ liệu: giá trị , tham chiếu
- Khai báo biến : qui tắc, cách đặt tên
- Các kiểu dữ liệu cơ bản
Các kiểu dữ liệu
•
C# cung cấp 2 kiểu thể hiện dữ liệu
•
Kiểu dữ liệu có sẵn – chuẩn . Ví dụ kiểu số
nguyên : có thể lưu trữ 1 giá trị số nguyên.
Ngoài thông tin lưu trữ ra , các biến kiểu này
không có thêm bất kỳ thông tin nào khác
•
Kiểu do NSD định nghĩa , thường gọi là lớp
(class): có thể chứa thông tin cùng nhiều
nhiều thông tin khác
Các kiểu dữ liệu(tt)
•
Ví dụ : Có thể xây dựng 1 lớp để thể hiện lớp
mèo nhà , trong lớp này, ta có những thông
tin như : tuổi, màu lông. Cũng tropng lớp
này, ta lại mô tả những khả năng của lớp
mèo như : kêu meo meo, ăn hay ngủ.
•
Các khả năng của 1 lớp thiết kế và thi
công : gọi là phương thức của 1 lớp.
•
Kiểu do NSD định nghĩa bao gồm các lớp và
giao diện do người lập trỉnh xây dựng và
đóng góp thêm vào thư viện .NET Framework
Cách lưu trữ và truy xuất dữ liệu
•
Kiểu dữ liệu giá trị : lưu trữ trên stack, biến
chứa giá trị trong chính nó
•
Kiểu dữ liệu tham chiếu: có 2 phần phần
tham chiếu (con trỏ, số hiệu – handle) chứa
trên stack, bản thân thông tin đối tượng lưu
trữ trên heap (do C# quản lý). Phần tham
chiếu chứa địa chỉ của đối tượng trên heap
•
Satck được C# quản lý nhằm chứa tất cả các
biến được tạo ra trong chương trình
•
Biến lưu trên heap được tạo bởi lập trình viên
bằng cách sử dụng toán tử “new”
Lưu trữ biến trên stack và heap
•
Biến kiểu nguyên (integer : kiểu giá trị) ,biến
kiểu chuổi (string : kiểu tham chiếu), biến ký
tự (kiểu giá trị)
Sao chép dữ liệu – phép gán
•
Ngoài sự khác biệt về việc lưu trữ thông tin,
kiểu giá trị và tham chiếu còn có khác biệt cơ
bản trong thao tác “sao chép”
•
Khi 1 biến kiểu giá trị đưọc gán bởi 1 biến
khác : Giá trị lưu trữ sẽ được sao chép từ
biến này sang biến kia.
Deep Copy
•
Cả 2 biến count1 và count2 đều có dữ
liệu riêng của chúng, trong trường hợp
này là 5. Vùng dữ liệu của 2 biến độc
lập nhau. Nghĩa là nếu gán 6 cho
count1 thì count2 vẫn có giá trị 5
•
Kiểu sao chép này được gọi là “deep
copy” (sao chép sâu): Giá trị, thông tin
của biến dữ liệu được sao chép.
Shallow Copy
•
Các biến tham chiếu thực hiện lệnh gán theo
1 cách khác
•
Lưu ý là kiêu tham chiếu gồm 2 thành
phần : dữ liệu thực sử trên heap và địa chỉ
tham chiếu đến vùng dữ liệu này chứa trong
stack.
•
Khi gán 1 biến tham chiếu này cho biến
tham chiếu khác : chỉ sao chép địa chỉ tham
chiếu mà thôi cả 2 biến đều tham chiếu
đến cùng 1 vùng dữ liệu trên heap(shallow
copy).
•
Ví dụ
Ví dụ lệnh gán
Ví dụ lệnh gán
Ví dụ (phép gán với biến class)
class Point
{
public int x,y;
public Point(int u, int v){x=u;y=v;}
}
public class VD4
{
static public void Main()
{
Point a=new Point (1,2);
Point b=new Point (3,4);
Point c=new Point (1,2);
Console.WriteLine("a = b > {0}", a= =b);
Console.WriteLine("a = c > {0}", a= =c);
b=a;
Console.WriteLine("a = b > {0}", a==b);
a.x++;
b.y ;
Console.WriteLine("a({0},{1}) b({2},
{3})",a.x,a.y,b.x,b.y);
Console.ReadLine();
}
}
Demo2.VD4
Khai báo biến
•
Phần trình bày tiếp theo sẽ đề cập
đến các vấn đề sau
–
Khai báo, sử dụng các kiểu có sẵn
–
Các qui tắc, các gợi ý khi khai báo
và đật tên biến
–
Một số hiệu ứng khi thực hiện
phép toán gán (=)
•
Như đã nói ở phần trên các kiểu
built-in là các kiểu giá trị: 1 biến
kiểu này có thể xem như 1 vùng
nhớ chứa trực tiếp giá trị dữ liệu
Khai báo biến (tt)
•
int count = 5;
float temperature = 99.5F;
•
Giá trị kiểu float phải theo sau bằng ký tự "F".
Nếu không : hiểu là “doubles”
•
Kiểu double cũng chứa giá trị số thực nhưng có
phạm vì biểu diễn rộng hơn và có độ chính xác cao
hơn
Ví dụ
static public void Main()
{
float x=23.12345678F, y=23.12345679F;
double x1=23.12345678, y1=23.12345679;
Console.WriteLine(x= =y);
Console.WriteLine(x1= =y1);
Console.ReadLine();
}
•
Demo2.VD2
Lưu trữ biến giá trị
•
Tóm lại : biến kiểu giá trị là 1 vùng bộ nhớ chứa
dữ liệu của chính nó cùng với 1 tên mô tả
Qui tắc đặt tên biến
•
Vấn đề : tên phải đặt sao cho hợp lệ và
có tính gợi nhớ, tránh sai sót
•
Qui tắc đật tên trong C#
Tên (danh hiệu) bao gồm ký tự, ký số và lý tự
gạch dướiunderscores (_).
Tên(danh hiệu phải bắt đầu bằng 1 ký tự hay
ký tự gạch dưới.
Tên(danh hiệu) không được trùng với các từ
khóa (keyword , reserved word).
Tên biến nào hợp lệ?
•
int idnumber;
int transaction_number;
int __my_phone_number__;
float 4myfriend;
float its4me;
double VeRyStRaNgE;
float while;
float myCash;
int CaseNo;
int CASENO;
int caseno;
Trả lời
•
int idnumber; Hợp lệ
int transaction_number; Hợp lệ
int __my_phone_number__; Hợp lệ
float 4myfriend; Không Hợp lệ
float its4me; Hợp lệ
double VeRyStRaNgE; Hợp lệ
float while; Không Hợp lệ
float myCash; Hợp lệ
Lưu ý !!!!
•
C# phân biệt chữ thường chữ hoa, vì vậy các
khai báo dưới đây sẽ tạo ra 3 biến khác biệt
nhau
int CaseNo;
int CASENO;
int caseno;
•
Do vậy tránh sử dụng những khai báo nhập
nhằng như trên do có thể dẫn đến sai sót khi
lập trình
Thủ thuật đặt tên biến
•
Việc đặt tên biến rất quan trọng : sử dụng
trong chương trình, tìm lỗi,bảo trì,…
•
Ví dụ :Biến lưu trữ năm sinh của 1 học viên
namSinh
NamSinh
NAMSINH
nam_sinh
_nam_sinh
Tất cả đều hợp lệ !!.
Thủ thuật đặt tên biến (tt)
•
Qui tắc do Microsoft đề xuất : không bắt đầu
bằng ký tự _, ký tự đầu tiên là ký tự thường,
các ký tự đầu tiên trong các từ tiếp theo ở dạng
chữ hoa.
cabinPressure
restrictedTransactionType
bodyTemperature
newYorkYankees
momentOfInertia
aLengthyUnnecessaryLongVariableName
•
Tránh dùng lại 1 tên biến dù sử dụng tính
chất : C# phân biệt ký tự thường/hoa.
int namSinh , namsinh, NamSinh ;
Các kiểu dữ liệu giá trị
•
Kiểu Kích cỡ Mô tả
•
bool 1 byte true or false
•
byte 1 byte Số nguyên không dấu (0-255)
•
char 2 bytes ký tự trong bảng mã Unicode
•
decimal 16 bytes độ chính xác đến 28 ký số
•
double 8 bytes số thực (chính xác gấp 2)
•
float 4 bytes số thực
•
int 4 bytes Số nguyên:-2 tỷ đến 2 tỷ (xấp xỉ)
•
long 8 bytes Số nguyên có dấu
•
sbyte 1 byte -128 đến 127
•
short 2 bytes -32000 đến 32000 (xấp xỉ)
•
uint 4 bytes 0 4 tỳ
•
ulong 8 bytes Số nguyên không dấu
•
ushort 2 bytes Số nguyên từ 0 64000(xấp xỉ)
Từ khoá (Keywords )
•
abstract as base bool break byte case catch
•
char checked class const continue
•
decimal default delegate do double else
•
enum event explicit extern false finally
•
fixed float for foreach goto if implicit
•
in int interface internal is lock long
•
namespace new null object operator out
•
override params private protected public
•
readonly ref return sbyte sealed short sizeof stack
•
alloc static string struct switch this throw
•
true try typeof uint ulong unchecked
•
unsafe ushort using virtual void while