Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Sử dụng struct trong lập trình C#

  1. #1
    Ngày gia nhập
    01 2007
    Bài viết
    412

    Smile Sử dụng struct trong lập trình C#

    Trong C#, lớp đượ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#.
    Một struct là 1 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à 1 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 1 biến kiểu lớp thì lại chứa 1 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 1 hệ thống, hoặc cặp key - value trong cấu trúc từ điển.

    Thế struct được khai báo như thề nào? ^_^ Struct được khai báo tổng quát như sau:
    Syntax Code:
    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:
    Visual C# Code:
    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:
    Visual C# Code:
    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 thì sao?? 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 1 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:
    Visual C# Code:
    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.         }

    Thế còn bộ hủy (destructor) thì sao đại ca? À, 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à 1 sai lầm khi khai báo 1 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 1 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:
    Visual C# Code:
    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 la làng:
    Visual C# Code:
    1. public string key = "123";
    2. public string value = "Hello World";

    Khởi tạo một đối tượng struct:
    Visual C# Code:
    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ị:
    Visual C# Code:
    1. Console.WriteLine("key = {0},value = {1}",kv.key,kv.value);

    Ở trên, ta thấy khởi tạo 1 struct có dùng đến từ khóa new, á, sao nó quen quen, y hệt như với class. Đúng đấy, nhưng không như class đâu đấy nhé, vì 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:
    Visual C# Code:
    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ì. Bạn có thể dùng, nhưng rủi ro thì bạn tự chịu đấy nhá

    Và mình xin được kết thúc bài viết với 1 ví dụ về struct được lấy từ MSDN:
    Visual C# Code:
    1. public struct CoOrds
    2. {
    3.     public int x, y;
    4.  
    5.     public CoOrds(int p1, int p2)
    6.     {
    7.         x = p1;
    8.         y = p2;
    9.     }
    10. }
    11. // Declare and initialize struct objects.
    12. class TestCoOrds
    13. {
    14.     static void Main()
    15.     {
    16.         // Initialize:  
    17.         CoOrds coords1 = new CoOrds();
    18.         CoOrds coords2 = new CoOrds(10, 10);
    19.  
    20.         // Display results:
    21.         System.Console.Write("CoOrds 1: ");
    22.         System.Console.WriteLine("x = {0}, y = {1}", coords1.x, coords1.y);
    23.  
    24.         System.Console.Write("CoOrds 2: ");
    25.         System.Console.WriteLine("x = {0}, y = {1}", coords2.x, coords2.y);
    26.     }
    27. }

  2. #2
    Ngày gia nhập
    09 2010
    Nơi ở
    Hải Phòng city
    Bài viết
    527

    Mặc định Sử dụng struct trong lập trình C#

    em muốn có 1 mảng động kiểu struct thì khai báo làm sao, sử dụng thêm phần tử vào, rùi xoa phần tử đi như thể nào anh? cho em vài ví dụ đơn giản nhé.
    thanks.

Các đề tài tương tự

  1. Gửi struct thông qua socket có khác nhau giữa gửi từng field và gửi cả struct?
    Gửi bởi bptvip_pro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 12-05-2013, 02:35 AM
  2. Bài tập C++ làm sao truy xuất biến của struct lồng trong struct
    Gửi bởi quangnam.tamky trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 10-04-2013, 05:22 PM
  3. Lập trình C++ Giúp đỡ về điểm khác nhau giữa struct và typedef struct
    Gửi bởi huydang2410 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 27-02-2013, 10:30 AM
  4. Khác nhau giữa struct trong c và struct trong c++
    Gửi bởi nhutlv01 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 17-02-2012, 09:12 AM
  5. Lỗi không xử lý giá trị struct (trong if else)
    Gửi bởi duyanh_28 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 25-05-2011, 12:13 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn