2015-02-12 5 views
5

मैं प्राप्त करने के लिए structs परिभाषित कर रहा हूं और विभिन्न उपकरणों और विभिन्न प्रोग्रामिंग भाषाओं के बीच एक संचार चैनल पर भेजा गया है। इसके लिए मैं स्पष्ट रूप से StructLayoutAttribute (अनुक्रमिक, पैक = 1 - यदि यह मायने रखता है) का उपयोग करके स्मृति में अपने लेआउट को स्पष्ट रूप से परिभाषित करता है।सी # में गुणों पर StructLayoutAttribute प्रभाव क्या है?

प्रलेखन से, मुझे पता है कि यह कार्य करता है जब संरचना में केवल फ़ील्ड होते हैं। ऐसा लगता है कि 'सरल' गुणों के लिए भी काम किया जाता है (खाली पाने के साथ; सेट;)। हालांकि मुझे नहीं पता कि यह हमेशा मामला है या नहीं।

तो मेरे सवाल गुणों पर StructLayoutAttribute प्रभाव के बारे में दो को बांटा गया है:

  1. सरल गुण करो (फिर से, खाली मिलता है, सेट;) क्षेत्रों के रूप में ही व्यवहार करते हैं?
  2. अन्य गुण कैसे व्यवहार करते हैं, उदाहरण के लिए गुण जो उनके प्राप्त होते हैं वे अन्य गुणों पर गणना करते हैं? क्या उन्हें नजरअंदाज कर दिया गया है (क्योंकि मुझे उनके पीछे एक वास्तविक डेटा आइटम नहीं दिख रहा है)? क्या वे स्मृति लेते हैं?
+0

तो 3 उत्तरों और किसी ने भी वास्तव में व्यवहार करने के तरीके पर कोई इनपुट नहीं दिया है। मुझे पता है कि आप इस पर निर्भर नहीं कर सकते हैं, लेकिन यदि आप एक विशिष्ट कंपाइलर का उपयोग कर सकते हैं तो आप कर सकते हैं। – leppie

+0

जब भाषा व्यवहार को नियंत्रित करने के लिए सुविधाएं प्रदान करती है तो आप विशिष्ट कंपाइलर पर क्यों निर्भर करेंगे? बीटीडब्ल्यू मैंने जो लिंक प्रदान किया है, उसमें विवरण शामिल है कि संकलक कैसे व्यवहार करता है। – Stilgar

+0

मैंने निजी फ़ील्ड और सार्वजनिक गणना की गई संपत्तियां तैयार कीं। चूंकि मैं कोड पीढ़ी का उपयोग करता हूं, यह एक बार परिवर्तन था। – Asaf

उत्तर

3

गुणों में कोई संग्रहण नहीं है। StructLayoutAttribute उन्हें प्रभावित नहीं करता है।

ऑटो गुण एक उत्पन्न समर्थन क्षेत्र है जो StructLayoutAttribute के अधीन है का उपयोग (के बाद से सभी क्षेत्रों इस विशेषता के अधीन हैं)। हालांकि उन क्षेत्रों का क्रम परिभाषित नहीं किया गया है।

चूंकि गुणों की गणना करने वाले गुणों के पास कोई भंडारण नहीं है, इसलिए उन्हें मार्शल नहीं किया जाता है।

+0

धन्यवाद। आपका क्या मतलब है "उन क्षेत्रों का क्रम परिभाषित नहीं किया गया है"? क्या इसका मतलब है कि बैकिंग फ़ील्ड अनुक्रमिक विशेषता को अनदेखा करते हैं? – Asaf

+1

इसका मतलब है कि सी # कंपाइलर उत्पन्न बैकिंग फ़ील्ड्स को किसी भी क्रम में रखने के लिए स्वतंत्र है। यह अनुक्रमिक रूप से संपत्ति को नष्ट कर देता है जिसे आपको आवश्यकता होती है। सीएलआर का पालन करेगा, लेकिन csc.exe नहीं हो सकता है। – usr

1

ऑटो गुण ({get; set;}) में सार्वजनिक रूप से पहुंच योग्य बैकिंग फ़ील्ड है जो स्वचालित रूप से बनाई जाती है। वास्तव में, यदि आप एक श्रेणी के उन क्षेत्रों को देखने के लिए प्रतिबिंब का उपयोग करते हैं जिनके पास ऑटो प्रॉपर्टी है, तो आप देख सकते हैं कि उस संपत्ति के लिए एक निजी क्षेत्र है। नीचे दिया गया कोड <Bar>k__BackingField प्रिंट करता है - एक अजीब फ़ील्ड नाम, लेकिन फिर भी एक फ़ील्ड नाम!

मैं नहीं कह सकता कि मैंने संपत्ति पर StructLayoutAttribute कोशिश की है। यदि यह काम करता है, तो यह निश्चित रूप से बैकिंग फ़ील्ड पर उसी तर्क को लागू करता है।

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

धन्यवाद। क्या बैकिंग फ़ील्ड नियमित फ़ील्ड के समान नियमों के अनुरूप होंगे (उदाहरण के लिए अनुक्रमिक लेआउट पर ऑर्डर बनाए रखना)? और गैर-ऑटो गुणों के बारे में क्या?मुझे लगता है कि वे लेआउट को प्रभावित नहीं करते हैं? – Asaf

+0

जैसा मैंने कहा, मैंने कोशिश नहीं की है। यहां तक ​​कि यदि यह संकलित होता है, तो आपको यह देखने के लिए परीक्षण करना होगा कि विशेषता वास्तव में कुछ कर रही है या नहीं। मैं गैर-ऑटो गुणों * काम * करने की अपेक्षा करता हूं। न तो संकलक और न ही रनटाइम गैर-ऑटो प्रॉपर्टी और उस क्षेत्र के बीच संबंधों का अनुमान लगा सकता है जिसे आपने स्पष्ट रूप से परिभाषित किया है। –

+0

क्षमा करें, लेकिन मैं वास्तव में नहीं देख सकता कि यह प्रश्न का उत्तर कैसे है। – Stilgar

2

दस्तावेज़ीकरण और मेरे परीक्षणों के अनुसार FieldOffsetAttribute गुणों पर लागू नहीं किया जा सकता है। यह लेआउटकिंड का सवाल छोड़ देता है। आवश्यक। this article के अनुसार संपत्ति क्षेत्र अंत में दिखाई देते हैं। यदि आप लेआउट की परवाह करते हैं तो मूल रूप से ऑटो गुणों का उपयोग न करें। उन्हें विस्तृत करें और खेतों को एनोटेट करें। परिकलित गुण संरचना के स्मृति लेआउट में प्रकट नहीं होते हैं।

संबंधित मुद्दे