2015-02-12 12 views
5

Tôi đang xác định các cấu trúc được nhận và gửi qua kênh giao tiếp giữa các thiết bị khác nhau và các ngôn ngữ lập trình khác nhau. Để tôi xác định rõ bố cục của chúng trong bộ nhớ bằng cách sử dụng StructLayoutAttribute (tuần tự, gói = 1 - trong trường hợp nó quan trọng).Hiệu ứng StructLayoutAttribute trên các thuộc tính trong C# là gì?

Từ tài liệu, tôi biết nó hoạt động khi cấu trúc chỉ chứa các trường. Nó dường như cũng làm việc cho các thuộc tính 'đơn giản' (với trống rỗng; bộ;). Tuy nhiên tôi không biết nếu nó luôn luôn như vậy.

Vì vậy, câu hỏi của tôi liên quan đến hiệu ứng StructLayoutAttribute về tài sản được chia cho hai:

  1. Do tính chất đơn giản (một lần nữa, trống get; set;) cư xử giống như các lĩnh vực?
  2. Các thuộc tính khác hoạt động như thế nào, ví dụ các thuộc tính mà chúng nhận được là tính toán trên các thuộc tính khác? Họ có bị bỏ qua (vì tôi không thấy một mục dữ liệu thực sự đằng sau họ)? Họ có nhớ không?
+0

Vì vậy, 3 câu trả lời và không ai đưa ra bất kỳ đầu vào nào về cách thức hoạt động thực tế. Tôi biết bạn không thể phụ thuộc vào nó cho spec, nhưng nếu bạn sử dụng một trình biên dịch cụ thể bạn có thể. – leppie

+0

Tại sao bạn sẽ phụ thuộc vào trình biên dịch cụ thể khi ngôn ngữ cung cấp cơ sở để kiểm soát hành vi? BTW liên kết tôi đã cung cấp chứa các chi tiết về cách trình biên dịch hoạt động. – Stilgar

+0

Tôi đã kết thúc việc tạo các trường riêng và các thuộc tính được tính toán công khai. Vì tôi sử dụng việc tạo mã, đó là thay đổi một lần. – Asaf

Trả lời

3

Thuộc tính không có bộ nhớ. StructLayoutAttribute không ảnh hưởng đến chúng.

Thuộc tính tự động truy cập trường sao lưu được tạo có thể là StructLayoutAttribute (vì tất cả các trường đều phải tuân theo thuộc tính này). Thứ tự của các trường đó không được xác định.

Vì các thuộc tính có tính toán giá trị không có bộ nhớ, chúng không được sắp xếp lại.

+0

cảm ơn. Ý bạn là gì "Thứ tự của các trường đó chưa được xác định"? Điều đó có nghĩa là các trường sao lưu bỏ qua thuộc tính tuần tự? – Asaf

+1

Nó có nghĩa là trình biên dịch C# là miễn phí để đưa các trường sao lưu được tạo ra theo bất kỳ thứ tự nào mà nó thích. Điều đó phá hủy tài sản tuần tự mà bạn dường như cần. CLR sẽ tuân thủ, nhưng csc.exe có thể không. – usr

1

Thuộc tính tự động ({get; set;}) có trường sao lưu công khai không thể truy cập được tạo tự động. Trong thực tế, nếu bạn sử dụng sự phản chiếu để xem xét các trường của một lớp có thuộc tính tự động, bạn có thể thấy rằng có một trường riêng cho thuộc tính đó. Mã dưới đây in <Bar>k__BackingField - một tên trường lạ, nhưng một tên trường dù sao!

Tôi không thể nói rằng tôi đã thử StructLayoutAttribute trên một sản phẩm. Nếu nó hoạt động, nó chắc chắn chỉ áp dụng cùng một logic đó cho trường sao lưu.

using System; 
using System.Reflection; 

namespace ConsoleApplication10 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var fields = typeof(Foo).GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
      Console.WriteLine(fields[0].Name); 
     } 
    } 

    class Foo 
    { 
     public int Bar { get; set; } 
    } 
} 
+0

cảm ơn. Các trường sao lưu có tuân thủ các quy tắc giống như các trường thông thường (ví dụ: duy trì thứ tự trên bố cục tuần tự) không? Và những gì về tài sản không tự động?Tôi cho rằng chúng không ảnh hưởng đến bố cục? – Asaf

+0

Như tôi đã nói, tôi chưa thử. Ngay cả khi nó biên dịch, bạn sẽ phải kiểm tra xem thuộc tính có đang thực sự làm gì không. Tôi mong đợi các thuộc tính không tự động * không * hoạt động. Cả trình biên dịch cũng như thời gian chạy đều không thể suy ra mối quan hệ giữa thuộc tính không tự động và trường mà bạn đã xác định rõ ràng. –

+0

Xin lỗi nhưng tôi thực sự không thể thấy đây là câu trả lời cho câu hỏi. – Stilgar

2

Theo tài liệu và kiểm tra của tôi FieldOffsetAttribute không thể áp dụng cho thuộc tính. Điều này để lại câu hỏi về LayoutKind.Sequential. Theo this article các trường thuộc tính xuất hiện ở cuối. Về cơ bản không sử dụng các thuộc tính tự động nếu bạn quan tâm đến bố cục. Mở rộng chúng và chú thích các trường. Thuộc tính được tính không xuất hiện trong bố cục bộ nhớ của cấu trúc.

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