cau truc srtuct

29 views
Skip to first unread message

k2 khmt3

unread,
Nov 30, 2009, 12:54:16 PM11/30/09
to nh3t.khmt3.k2
Struct trong C#
Trả lời Liên hệ
Trong C#, lớp (class) được dùng để tạo phần lớn những đối tượng. Tuy
nhiên, đôi khi người ta cũng muốn tạo dựng những đối tượng hoạt động
tương tự như những kiểu dữ liệu bẩm sinh, ít dùng đến bộ nhớ, có thể
được cấp phát nhanh và không tốn nhiều bộ nhớ do việc qui chiếu. Trong
trường hợp này, ta dùng đến kiểu dữ liệu trị, thực hiện bằng cách khai
báo một struct trong C#.
Struct là kiểu dữ liệu tự tạo, "nhẹ cân" có thể thay thế lớp. Struct
cũng tương tự như lớp, nghĩa là một cấu trúc dữ liệu có thể chứa các
thành viên dữ liệu và thành viên hàm (bộ khởi tạo, phương thức,....)
Nói là vậy, giữa struct và lớp vẫn có nhiều khác biệt. Struct khác lớp
ở chỗ: struct là loại dữ liệu kiểu trị nghĩa là không được cấp phát bộ
nhớ trên heap. Một biến struct sẽ chứa trực tiếp dữ liệu của struct,
trong khi một biến kiểu lớp thì lại chứa một quy chiếu về dữ liệu được
biết như là đối tượng. Ngoài ra, struct không hỗ trợ kế thừa và hàm
hủy.
Struct chỉ hữu ích đối với những đối tượng không đòi hỏi ý nghĩa quy
chiếu. Ví dụ: các số phức, các điểm trên một hệ thống, hoặc cặp key -
value trong cấu trúc từ điển.
Khai báo Struct
Struct được khai báo tổng quát như sau:
view plainprint?
1. [thuộc tính] [bổ sung truy cập] struct <tên struct> [:
2. danh sách giao diện] [thành viên struct]
3. {
4. // thuộc tính, phương thức,...
5. }

Ví dụ: cho struct như sau:
view plainprint?
1. public struct HeThongToaDo
2. {
3. float x,y; //thuoc tinh
4. public HeThongToaDo(float p1,float p2) //bo khoi tao
5. {
6. x=p1;
7. y=p2;
8. }
9. }

Và sử dụng như sau:
view plainprint?
1. class Test
2. {
3. static void Main()
4. {
5. HeThongToaDo httd = new HeThongToaDo(5.5f,10f);
6. System.Console.WriteLine("x = {0},y = {1}",httd1.x,httd.y);
7. }
8. }

Hàm khởi dựng và kế thừa trong struct
Khác với lớp, struct không hỗ trợ kế thừa. Các đối tượng struct được
dẫn xuất từ lớp Object, nhưng struct không thể kế thừa từ bất cứ lớp
nào và struct nào, và cũng không thể dùng làm cơ sở cho một lớp. Tuy
nhiên, giống như lớp, struct có thể thiết đặt nhiều giao diện, và làm
y chang với lớp. Sau đây là vị dụ minh họa:
view plainprint?
1. interface IHinhAnh
2. {
3. void VeRaManHinh();
4. }
5. struct Picture : IHinhAnh
6. {
7. private int x, y, z;
8. public void Paint()
9. {
10. //do something
11. }
12. }

Bô hủy (destructor) trong struct
Struct không có hàm hủy nhưng có vẫn có hàm khởi dựng (constructor),
nhưng các hàm này phải có thông số đấy nhé. Sẽ là một sai lầm khi khai
báo một hàm khởi dựng mặc nhiên không thông số. Nếu bạn không cung cấp
hàm constructor, thì struct sẽ nhận được một hàm constructor mặc định
từ compiler, và hàm này sẽ cho những vùng mục tin kiểu trị về những
giá trị mặc địch thích ứng với kiểu dữ liệu, còn những vùng mục tin
kiểu qui chiếu thì cho về null. Còn nếu bạn muốn cung cấp bất cứ hàm
constructor nào có thông số, thì bạn phải khởi gán tất cả các vùng mục
tin ngay trong struct. Các thành viên của struct không thể có những bộ
khởi gán. Ta có ví dụ sau:
view plainprint?
1. struct KeyValue
2. {
3. public string key;
4. public string value;
5. public KeyValue(string key, string value)
6. {
7. this.key = key;
8. this.value=value;
9. }
10. }

Lưu ý: bạn không thể khởi gán một instance field trên một struct. Do
đó, gõ code như sau là bị compiler báo lỗi:
view plainprint?
1. public string key = "123";
2. public string value = "Hello World";

Khởi tạo một đối tượng struct:
view plainprint?
1. KeyValue kv = new KeyValue("123", "Hello world");

Sau khi khởi tạo xong, ta sử dụng nó như những giá trị kiểu trị:
view plainprint?
1. Console.WriteLine("key = {0},value = {1}",kv.key,kv.value);

Ở trên, ta thấy khởi tạo một struct có dùng đến từ khóa new giống như
với class. Không như class, struct là dữ liệu kiểu trị, do đó nó được
cấp phát bộ nhớ trên stack (còn class thì trên heap).
Tuy nhiên, bạn có thể khởi tạo struct mà không dùng đến new. Sau đây
là ví dụ minh họa:
view plainprint?
1. namespace ConsoleApplication1
2. {
3. class Program
4. {
5. struct KeyValue
6. {
7. public string key;
8. public string value;
9. public KeyValue(string key, string value)
10. {
11. this.key = key;
12. this.value = value;
13. }
14. }
15. static void Main(string[ args)
16. {
17. KeyValue kv; // khong trieu goi ham khoi tao
18. kv.key = "123";
19. kv.value = "Hello";
20. Console.WriteLine("key = {0},value = {1}", kv.key, kv.value);
21. }
22. }
23. }

Bạn lưu ý tạo struct không dùng new không đem lại nhiều lợi ích đâu,
và có thể tạo khó khăn cho chương trình đọc khó hiểu, dễ sai, khó bảo
trì.
Ví dụ
Kết thúc bài viết với một ví dụ về struct được lấy từ MSDN:
view plainprint?
1. public struct CoOrds
2. {
3. public int x, y;
4. public CoOrds(int p1, int p2)
5. {
6. x = p1;
7. y = p2;
8. }
9. }
10. // Declare and initialize struct objects.
11. class TestCoOrds
12. {
13. static void Main()
14. {
15. // Initialize:
16. CoOrds coords1 = new CoOrds();
17. CoOrds coords2 = new CoOrds(10, 10);
18. // Display results:
19. System.Console.Write("CoOrds 1: ");
20. System.Console.WriteLine("x = {0}, y = {1}", coords1.x,
coords1.y);
21. System.Console.Write("CoOrds 2: ");
22. System.Console.WriteLine("x = {0}, y = {1}", coords2.x,
coords2.y);
23. } 24. }

k2 khmt3

unread,
Nov 30, 2009, 1:37:41 PM11/30/09
to nh3t.khmt3.k2
qua hay
Reply all
Reply to author
Forward
0 new messages