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. }