2013-05-17 3 views
23

मेरे सी # एप्लिकेशन में मुझे कॉलबैक/प्रतिनिधि में सी ++ संरचना के लिए पॉइंटर प्राप्त होता है। मुझे यकीन नहीं है कि class चाल कर सकता है लेकिन उचित सी # संरचना के लिए सी ++ पॉइंटर कास्टिंग ठीक काम करता है, इसलिए मैं डेटा संग्रह करने के लिए सी # संरचना का उपयोग कर रहा हूं।पास सी # संरचना?

अब मैं आगे की प्रक्रिया के

  • मैं class उपयोग नहीं कर सकते क्योंकि यह शायद पूरी तरह से C++ struct करने के लिए "मानचित्र" नहीं होगा के लिए struct के संदर्भ में पारित करने के लिए चाहते हैं।
  • मैं बेहतर विलंबता के लिए struct नकल नहीं करना चाहती

मैं ऐसा कैसे कर सकता है?


यह उदाहरण दर्शाता है कि struct, मूल्य द्वारा पारित कर दिया है संदर्भ द्वारा नहीं:

using System; 

namespace TestStruct 
{ 
    struct s 
    { 
     public int a; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      s s1 = new s 
         { 
          a = 1 
         }; 
      Foo(s1); 
      Console.WriteLine("outer a = " + s1.a); 
     } 

     private static void Foo(s s1) 
     { 
      s1.a++; 
      Console.WriteLine("inner a = " + s1.a); 
     } 

    } 
} 

आउटपुट है:

inner a = 2 
outer a = 1 
+4

संरचना के बारे में आपके तर्क से सावधान रहें: सी ++ में 'संरचना' बिल्कुल कक्षा (डिफ़ॉल्ट पहुंच को छोड़कर) के समान है, जबकि सी # में वे पूरी तरह अलग हैं - मूल्य और संदर्भ प्रकार। संभावना है कि आप सी # में कक्षाओं के साथ वास्तव में बेहतर होंगे - कम से कम पढ़े और समझें कि 'संरचना' सी # में कैसे व्यवहार करती है। –

+0

मेरी इंटरऑप कक्षाओं की एक बड़ी संख्या वास्तव में कक्षाएं हैं और structs नहीं हैं। यदि आप सही ढंग से marshalling (और अक्सर डिफ़ॉल्ट marshalling काम करता है) स्थापित करते हैं तो आप एक वर्ग का उपयोग कर सकते हैं। यदि संदेह है, तो मैं पहले कक्षा के साथ प्रयास करता हूं। –

उत्तर

40

ऐसा लगता है तुम सिर्फ ref उपयोग करने के लिए पास करना चाहते हैं की तरह संदर्भ द्वारा संरचना:

private static void Foo(ref s s1) 
{ 
    s1.a++; 
    Console.WriteLine("inner a = " + s1.a); 
} 

और कॉल स्थल पर:

Foo(ref s1); 

मेरी अधिक जानकारी के लिए article on parameter passing in C# देखें।

ध्यान दें कि इंटरऑप के अलावा, मैं आमतौर पर के विरुद्ध इस तरह के परिवर्तनीय structs का उपयोग करके दृढ़ता से अनुशंसा करता हूं। हालांकि मैं यहां लाभों को समझ सकता हूं।

+8

+1। साइड नोट: कोड स्ट्रक्चरिंग 'स्ट्रक्चर' को बहुत सावधानी से लिखा जाना चाहिए क्योंकि लगभग सभी ऑपरेशन 'स्ट्रक्चर' प्रतिलिपि बनाते हैं (सरणी को छोड़कर, जहां आप अभी भी तत्व के 'रेफरी' ले सकते हैं)। –

+0

आप 'रेफरी' से गुजरने वाले structs के खिलाफ दृढ़ता से अनुशंसा क्यों करते हैं? जहां तक ​​मैं कह सकता हूं, सी ++ (उदाहरण के लिए 'std :: string & ') में संदर्भ के रूप में यह वही बात है, और यह संभावित रूप से बड़े structs की अनावश्यक प्रतिलिपि को खत्म कर सकती है। –

+1

@cmbasnett: मैंने उत्परिवर्तनीय structs का उपयोग करने के खिलाफ दृढ़ता से अनुशंसा की। रेफरी द्वारा एक संरचना पास करना ठीक है, लेकिन ए) मैं सामान्य रूप से बड़े structs के खिलाफ सलाह देंगे; बी) मैं * mutable * structs (जैसा कि माइक्रोसॉफ्ट डिज़ाइन दिशानिर्देशों के अनुसार) के खिलाफ बहस करेगा क्योंकि वे कई आश्चर्यों का कारण बन सकते हैं। –

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