KIỂU DỮ LIỆU

C# là ngôn ng lp trình mnh v kiu d liu, mt ngôn ng mnh v kiu d liu là phi khai báo kiu ca mi đi tưng khi to (kiu s nguyên, s thc, kiu chui, kiu điu khin...) và trình biên dch s giúp cho ngưi lp trình không b li khi ch cho phép mt loi kiu d liu có th đưc gán cho các kiu d liu khác. Kiu d liu ca mt đi tưng là mt tín hiu đ trình biên dch nhn biết kích thưc ca mt đi tưng (kiu int có kích thưc là 4 byte) và kh năng ca nó (như mt đi tưng button có th v, phn ng khi nhn,...).

Tương t như C++ hay Java, C# chia thành hai tp hp kiu d liu chính: Kiu xây dng sn (built- in) mà ngôn ng cung cp cho ngưi lp trình và kiu đưc ngưi dùng đnh nghĩa (user-defined) do ngưi lp trình to ra.

C# phân tp hp kiu d liu này thành hai loi: Kiu d liu giá tr (value) và kiu d liu tham chiếu (reference). Vic phân chia này do s khác nhau khi lưu kiu d liu giá tr và kiu d liu tham chiếu trong b nh. Đi vi mt kiu d liu giá tr thì s đưc lưu gi kích thưc tht trong b nh đã cp phát là stack. Trong khi đó thì đa ch ca kiu d liu tham chiếu thì đưc lưu trong stack nhưng đi tưng tht s thì lưu trong b nh heap.

Kiu d liu (data type) là mt tp hp gm các nhóm d liu có cùng đc tính, cách lưu tr ca d liu và các phép toán x lý trên trưng d liu đó; nhm mc đích phân loi các d liu. Vic tìm hiu và s dng đúng các kiu d liu s giúp ti ưu hóa đưc vùng nh cũng như s s dng đưc các hàm x lý d liu dành riêng cho mi kiu d liu.

@Ghi chú: Tt c các kiu d liu xây dng sn là kiu d liu giá tr ngoi tr các đi tưng và chui. Và tt c các kiu do ngưi dùng đnh nghĩa ngoi tr kiu cu trúc đu là kiu d liu tham chiếu.

Ngoài ra C# cũng h tr mt kiu con tr C++, nhưng hiếm khi đưc s dng, và ch khi nào làm vic vi nhng đon mã lnh không đưc qun lý (unmanaged code). Mã lnh không đưc qun lý là các lnh đưc viết bên ngoài nn tng .NET, như là các đi tưng COM.

1.     Kiểu dữ liệu xây dựng sẵn

Ngôn ng C# đưa ra các kiu d liu xây dng sn rt hu dng, phù hp vi mt ngôn ng lp trình hin đi, mi kiu d liu đưc ánh x đến mt kiu d liu đưc h tr bi h thng xác nhn ngôn ng chung (Common Language Specification: CLS) trong MS.NET. Vic ánh x các kiu d liu nguyên thu ca C# đến các kiu d liu ca .NET s đm bo các đi tưng đưc to ra trong C# có th đưc s dng đng thi vi các đi tưng đưc to bi bt c ngôn ng khác đưc biên dch bi .NET, như VB.NET.

Mi kiu d liu có mt s xác nhn và kích thưc không thay đi, không ging như C++, int trong C# luôn có kích thưc là 4 byte bi vì nó đưc ánh x t kiu Int32 trong . NET.

Kiểu giá trị - value type

Các biến thuc kiu này có th đưc gán giá tr mt cách trc tiếp, đây là kiu d liu đưc ngôn ng cung cp. Nó kế tha t class System.ValueType.

Mt biến khi khai báo kiu d liu thì h thng s cp phát b nh, giá tr thì vùng nh ca biến đó s cha giá tr ca d liu.

Các bng dưi đây lit kê danh sách các kiu d liu có sn trong C#:

Bảng 1.3. Kiểu số nguyên

Kiểu dữ liệu

Kích thước (bytes)

Ý nghĩa

byte

1

Số nguyên dương không dấu có giá trị

từ 0 đến 255

sbyte

1

Số nguyên có dấu có giá trị

từ -128 đến 127

short

2

Số nguyên có dấu có giá trị

từ -32,768 đến 32,767

ushort

2

Số nguyên không dấu có giá trị

từ 0 đến 65,535

int

4

Số nguyên có dấu có giá trị

từ -2,147,483,647 đến  2,147,483,647

uint

4

Số nguyên không dấu có giá trị

từ 0 đến 4,294,967,295

long

8

Số nguyên có dấu có giá trị

từ -9,223,370,036,854,775,808 đến 9,223,370,036,854,775,807

ulong

8

Số nguyên không dấu có giá trị

từ 0 đến 18,446,744,073,709,551,615

Bảng 1.4. Kiểu ký tự

Kiểu dữ liệu

Kích thước (bytes)

Ý nghĩa

char

2

Chứa một ký tự Unicode

Bảng 1.5. Kiểu logic

Kiểu dữ liệu

Kích thước (bytes)

Ý nghĩa

bool

1

Chứa 1 trong 2 giá trị logic là true hoặc false

@Ghi chú: Kiu giá tr logic ch có th nhn đưc giá tr là true hay false mà thôi. Mt giá tr nguyên không th gán vào mt biến kiu logic trong C# và không có bt c chuyn đi ngm đnh nào. Điu này khác vi C/C++, cho phép biến logic đưc gán giá tr nguyên, khi đó giá tr nguyên 0 là false và các giá tr còn li là true.

Bảng 1.6. Kiểu số thực

Kiểu dữ liệu

Kích thước (bytes)

Ý nghĩa

float

4

Kiểu số thực dấu chấm động có giá trị dao động

từ 3.4E – 38 đến 3.4E + 38, với 7 chữ số có nghĩa

double

8

Kiểu số thực dấu chấm động có giá trị dao động

từ 1.7E – 308 đến 1.7E + 308, với 15, 16 chữ số có nghĩa

decimal

8

Có độ chính xác đến 28 con số và giá trị thập phân, được dùng trong tính toán tài chính

 

Từ khóa sizeof()

Trong trưng hp quên giá tr ca tng loi kiu d liu, có th s dng biu thc sizeof(type) đ ly kích c chính xác ca mt biu thc hoc mt biến nào đó. Giá tr tr v ca sizeof() là kích c ca đi tưng hoc kiu bng giá tr byte.

Kiểu tham chiếu - reference type

Nếu biến khai báo kiu d liu tham chiếu thì vùng nh ca nó không cha d liu thc s đưc lưu trong mt biến mà vùng nh ca nó ch cha đa ch ca đi tưng d liu. Hay chúng tham chiếu đến v trí nào đó trong b nh tùy theo đa ch đã đưc lưu. Gi s d liu trong vùng nh thay đi bi mt biến nào đó, thì các d liu ca biến khác cũng thay đi t đng giá tr ca mình.

Ta có mt s kiu d liu thuc kiu tham chiếu có sn trong C# như: object, dynamic, string... Và tt c các kiu d liu do ngưi dùng đnh nghĩa đu là kiu d liu tham chiếu.

Kiểu object

Đây là kiu d liu cơ bn nht ca tt c các kiu d liu trong .NET. Mi kiu d liu đu đưc kế tha t System.Object nên kiobject có th gán mi giá tr ca các kiu d liu khác như kiu tham chiếu, kiu giá tr hoc kiu do ngưi dùng t đnh nghĩa,... Tuy nhiên trưc khi gán giá tr nó cn đưc chuyn kiu.

Ví d:

object obj;

obj = 123;

// chúng ta đã chuyển kiểu dữ liệu object sang kiểu giá trị.

Kiểu dynamic

Đây là mt kiu d liu mi đưc đưa vào trong C# 4.0. Ta có lưu mi kiu giá tr trong biến kidynamic. Đi tưng thuc kiu này s không xác đnh đưc kiu d liu cho đến khi chương trình đưc thc thi.

Ta khai báo kidynamic như khai báo biến bình thưng:

Cú pháp

dynamic <tên biến>;

//hoặc

dynamic <tên biến> = <giá trị>;

Kiểu string

Đây là mt kiu d liu cho phép gán chui vào biến. Nó đưc kế tha t kiobject, có hai cách gán giá tr sau:

string str = "Lap trinh C#!";

//hoặc có thể dùng cách dưới đây, với cách này thì có thể dữ nguyên chuỗi truyền vào

//kể cả chuỗi có nhiều dòng.

string str =  @"Lap trinh C#          

              voi moi nguoi!";

Kiểu con trỏ - pointer type

Biếkiu con tr lưu đa ch b nh ca kiu khác. Con tr trong C# có cùng kh năng như con tr trong C hoc C++. Cú pháp đ khai báo biến kiu con tr là: type* identifier.

Ví d

char* abc;

int* xyz;

Chọn kiểu dữ liệu

Thông thưng đ chn mt kiu d liu nguyên đ s dng như short, int hay long thưng da vào đ ln ca giá tr mun s dng. Ví d, mt biến ushort có th lưu gi giá tr t 0 đến 65.535, trong khi biến ulong có th lưu gi giá tr t 0 đến 4.294.967.295, do đó tùy vào min giá tr ca phm vi s dng biến mà chn các kiu d liu thích hp nht. Kiu d liu int thưng đưc s dng nhiu nht trong lp trình vì vi kích thưc 4 byte ca nó cũng đ đ lưu các giá tr nguyên cn thiết.

Kiu s nguyên có du thưng đưc la chn s dng nhiu nht trong kiu s tr khi có lý do chính đáng đ s dng kiu d liu không du.

Cách tt nht khi s dng biến không du là giá tr ca biến luôn luôn dương, biến này thưng th hin mt thuc tính nào đó có min giá tr dương. Ví d khi cn khai báo mt biến lưu gi tui ca mt ngưi thì ta dùng kiu byte (s nguyên t 0-255) vì tui ca ngưi không th nào âm đưc.

Kiu float, double, và decimal đưa ra nhiu mc đ khác nhau v kích thưc cũng như đ chính xác.Vi thao tác trên các phân s nh thì kiu float là thích hp nht. Tuy nhiên lưu ý rng trình biên dch luôn luôn hiu bt c mt s thc nào cũng là mt s kiu double tr khi chúng ta khai báo rõ ràng. Đ gán mt s kiu float thì s phi có ký t f theo sau.

          float soFloat = 24f;

Kiu d liu ký t th hin các ký t Unicode, bao gm các ký t đơn gin, ký t theo mã Unicode và các ký t thoát khác đưc bao trong nhng du nháy đơn. Ví d, A là mt ký t đơn gin trong khi \u0041 là mt ký t Unicode. Ký t thoát là nhng ký t đc bit bao gm hai ký t liên tiếp trong đó ký t du tiên là du chéo ‘\’. Ví d, \t là du tab. Bng 3.2 trình bày các ký t đc bit.

Bảng 1.7. Các ký tự đặc biệt

Ký tự

Ý nghĩa

\’

Dấu nháy đơn

\”

Dấu nháy kép

\\

Dấu chéo

\0

Ký tự null

\a

Alert

Chuyển đổi các kiểu dữ liệu

Nhng đi tưng ca mt kiu d liu này có th đưc chuyn sang nhng đi tưng ca mt kiu d liu khác thông qua cơ chế chuyn đi tưng minh hay ngm đnh. Chuyn đi nhm đnh đưc thc hin mt cách t đng, trình biên dch s thc hin công vic này. Còn chuyn đi tưng minh din ra khi chúng ta gán ép mt giá tr cho kiu d liu khác.

Vic chuyn đi giá tr ngm đnh đưc thc hin mt cách t đng và đm bo là không mt thông tin. Ví d, chúng ta có th gán ngm đnh mt s kiu short (2 byte) vào mt s kiu int (4 byte) mt cách ngm đnh. Sau khi gán hoàn toàn không mt d liu vì bt c giá tr nào ca short cũng thuc v int:

      short x = 10;

      int y = x; // chuyển đổi ngầm định

Tuy nhiên, nếu chúng ta thc hin chuyn đi ngưc li, chc chn chúng ta s b mt thông tin. Nếu giá tr ca s nguyên đó ln hơn 32.767 thì nó s b ct khi chuyn đi. Trình biên dch s không thc hin vic chuyn đi ngm đnh t s kiu int sang s kiu short:

      short x;

      int y = 100;

      x = y;     // Không biên dịch, lỗi !!!

Đ không b li chúng ta phi dùng lnh gán tưng minh, đon mã trên đưc viết li như sau:

      short x;

      int y = 500;

      x = (short) y; // Ép kiểu tường minh, trình biên dịch không báo lỗi

2.     Kiểu dữ liệu người dùng định nghĩa

Ngoài ra còn có các kiu d liu tham chiếu do ngưi dùng t đnh nghĩa như class, interface hoc delegate s tìm hiu sau.

3.     Một số lỗi thường gặp khi khai báo

- Không gán giá tr cho biến (tr kiu string). Ví d: int a;

- Gán giá tr nm ngoài kiu d liu ca biến. Ví d: int b = 6.9;

- Dùng du nháy đơn cho kiu string. Ví d: string d = 'Q'; Vn phi s dng du nháy kép mc dù giá tr gán ch có 1 ký t.

- Gán giá tr null cho biến không phi kiu string. Ví d: long x = null; Ta có th sa thành long? x = null;

- Gán giá tr ca biến có kiu d liu ln hơn cho biến có kiu d liu nh hơn. Ví d: int x = 10; byte y = x; Mc dù 10 vn nm trong khong giá tr ca kiu byte nhưng vn không th gán giá tr biến kiu int cho biến kiu byte đưc.