2012-02-07 30 views
8

Tại sao nếu tôi sử dụng:Struct - Layout.Explicit - Constructor - đầy đủ các lĩnh vực assign

struct MyStruct 
{ 
     [FieldOffset (0)] public uint Data; 
     [FieldOffset (0)] public byte Something; 
} 

public MyStruct (uint pData) 
{ 
    Data = pData; // setting Data field also sets Something field 
} 

C# nói tôi cần phải gán 'Something' lĩnh vực:/Tôi biết tôi có thể làm một "vị thi công: này() " nhưng trình biên dịch phải biết trường 'Dữ liệu' chứa trường 'Cái gì đó'.

Vì vậy, tôi nên gọi constructor parameterless đầu tiên, đó là cách duy nhất?

Trả lời

-2

Bạn cần phải khởi tạo tất cả các trường của cấu trúc nếu bạn xác định hàm tạo tùy chỉnh. Xem this Hướng dẫn MSDN trong các cấu trúc để biết thêm thông tin - cụ thể dưới tiêu đề Constructors and Inheritence.

Dưới đây là một đoạn trích từ trang liên kết liên quan đến điều này:

Struct có thể tuyên bố nhà thầu, nhưng phải mất các thông số. Nó là một lỗi để khai báo một constructor mặc định (parameterless) cho một struct. Cấu trúc thành viên không thể có initializers. Một hàm tạo mặc định luôn được cung cấp để khởi tạo các thành viên struct thành các giá trị mặc định của chúng.

+0

Tôi đang nói về một thứ khác. – zgnilec

+0

@zgnilec Trong trường hợp đó tôi sẽ đề nghị xem lại câu hỏi của bạn vì nó không có ý nghĩa nhiều. –

+0

Vâng, có thể ai đó sẽ hiểu tôi. – zgnilec

5

Có, bạn cần phải gọi hàm tạo mặc định.

public MyStruct (uint pData) : this() 
{ 
    //... 
} 

Trình biên dịch sau đó sẽ tạo ra các hướng dẫn IL sau khi bắt đầu xây dựng của bạn:

ldarg.0   // Push address of struct onto stack 
initobj MyStruct // Pop address of struct and initialize it with "all zeros" 
+0

Điều này rất hữu ích. Làm điều này tăng tốc mã bằng một hoặc nhiều nano giây (tùy thuộc vào số lượng trường). – Forestrf

Các vấn đề liên quan