2012-06-16 7 views
11

मुझे कुछ कोड को संकलित करना पड़ा और मुझे नहीं पता कि यह वाक्यविन्यास क्या है? क्या आप मदद कर सकते हैं, या मुझे इसके बारे में लिखने के लिए इंगित कर सकते हैं? मैंने गुमराह किया है और इस साइट की खोज की है और कुछ भी नहीं मिला।ऑब्जेक्ट प्रकार के अंत में एम्परसेंड कैरेक्टर क्या है?

बस कोड की एक पंक्ति:

Rectangle pageBounds; 
    // ISSUE: explicit reference operation 
    // ISSUE: variable of a reference type 
    Rectangle& local = @pageBounds; 

"&" आयत ऑब्जेक्ट प्रकार के अंत में प्रतीक, और pageBounds चर से पहले "@" क्या है?

यह कोड की मेरी आखिरी पंक्ति है जिसे मुझे फिर से संकलित करने के लिए निष्पादन योग्य करने के लिए ठीक करने की आवश्यकता है।

यहां इस विधि का उपयोग करने वाली विधि है, क्या मैं इसे हटाने से दूर हो सकता हूं?

protected override void OnPrintPage(PrintPageEventArgs e) 
{ 
    Application.DoEvents(); 
    ++this._pageNum; 
    float num1; 
    if (this.Header != null) 
    { 
    num1 = this.Header.CalculateHeight(this, e.Graphics); 
    this.Header.Draw(this, (float) e.MarginBounds.Top, e.Graphics, e.MarginBounds); 
    } 
    else 
    num1 = 0.0f; 
    float num2; 
    if (this.Footer != null) 
    { 
    num2 = this.Footer.CalculateHeight(this, e.Graphics); 
    this.Footer.Draw(this, (float) e.MarginBounds.Bottom - num2, e.Graphics, e.MarginBounds); 
    } 
    else 
    num2 = 0.0f; 
    Rectangle pageBounds; 
    // ISSUE: explicit reference operation 
    // ISSUE: variable of a reference type 
    Rectangle& local = @pageBounds; 
    int left = e.MarginBounds.Left; 
    Rectangle marginBounds = e.MarginBounds; 
    int y = (int) ((double) marginBounds.Top + (double) num1); 
    marginBounds = e.MarginBounds; 
    int width = marginBounds.Width; 
    marginBounds = e.MarginBounds; 
    int height = (int) ((double) marginBounds.Height - (double) num2 - (double) num1); 
    // ISSUE: explicit reference operation 
    local = new Rectangle(left, y, width, height); 
    float yPos = (float) pageBounds.Top; 
    bool flag = false; 
    int num3 = 0; 
    while (this._printIndex < this._printElements.Count) 
    { 
    PrintElement printElement = (PrintElement) this._printElements[this._printIndex]; 
    float num4 = printElement.CalculateHeight(this, e.Graphics); 
    if ((double) yPos + (double) num4 > (double) pageBounds.Bottom && num3 != 0) 
    { 
     flag = true; 
     break; 
    } 
    else 
    { 
     printElement.Draw(this, yPos, e.Graphics, pageBounds); 
     yPos += num4; 
     ++this._printIndex; 
     ++num3; 
    } 
    } 
    e.HasMorePages = flag; 
} 
+1

संदर्भ के बारे में पढ़ें और पॉइंटर्स – Tschallacka

+0

@ माइकल डिबेट्स: यह सी # है ... – Ryan

+0

सी # में संदर्भ, पॉइंटर्स, * और * वैल्यू टी है ypes;) –

उत्तर

19

सही कोड की है कि लाइन से पहले टिप्पणियां आप कह रहे हैं कि वास्तव में क्या हो रहा है। & किसी प्रकार के नाम के बाद साइन इन इंगित करता है कि यह एक संदर्भ प्रकार है, और @ एक चर नाम से पहले उस चर के संदर्भ उत्पन्न करता है।

(@ चिह्न भी सी # कोड में चर नाम के रूप में उपयोग के लिए कीवर्ड "पलायन" के लिए इस्तेमाल किया जा सकता है लेकिन यह है कि यहाँ क्या हो रहा है नहीं है। "PageBounds" एक सी # शब्द नहीं है।)

नोट यह है कि मान्य सी # वाक्यविन्यास नहीं है - आप C# में स्थानीय चर के संदर्भ नहीं ले सकते हैं। यह उदाहरण के लिए ref और out पैरामीटर का उपयोग करते समय स्पष्ट रूप से होता है, लेकिन संदर्भ के रूप में पैरामीटर को स्पष्ट रूप से टाइप करने के बजाय कीवर्ड का उपयोग किया जाता है। आशय कोड की, (। उदाहरण के लिए यदि आप एक out int x, आंतरिक रूप से है कि वैरिएबल प्रकार Int32& की है था) अगर यह थे कानूनी सी #, हो सकता है कि pageBounds और local दो अलग-अलग नामों के साथ एक ही उदाहरण थे; आप जो कुछ भी करते हैं वह दूसरे के साथ होता है। तो, उदाहरण के लिए, इस अवैध कोड: आप के रूप में-decompiled कोड संकलन करने का प्रयास किया

Rectangle pageBounds = new Rectangle(); 

, आप क्योंकि एक त्रुटि मिलेगा:

Rectangle pageBounds; 
Rectangle& local = @pageBounds; 
local = new Rectangle(); 

इस कानूनी कोड के रूप में ही किया जाएगा कंपाइलर & बिटवाई के रूप में व्यवहार करता है और, और शिकायत करेगा कि आपने एक प्रकार का उपयोग किया है जैसे कि यह एक चर था। लेकिन यह ठीक है क्योंकि आपको इसे सी # स्रोत फ़ाइल से नहीं मिला है। आप इसे प्राप्त करने के लिए एक आईएल विधि decompiled, और आईएल में बहुत सी चीजें कर सकते हैं जो सी # में अवैध हैं। यह तब होता है जब आप कोड को संकुचित करते हैं; उदाहरण के लिए आप अवैध वर्ग और विधि नाम देखते हैं।इसका मतलब यह है कि संकलक ने मूल कोड के आधार पर आईएल उत्पन्न किया है जो सीधे सी # में अनुवाद नहीं करता है, लेकिन व्यवहार करता है जिस तरह से आप चाहते थे। जिस कोड को आप वापस प्राप्त कर रहे हैं वह डीकंपलर के आईएल से सी # कोड बनाने का सबसे अच्छा प्रयास है।

आप कोड की तरह है कि कई JetBrains बग रिपोर्ट में इन संदर्भों को उनके बारे में पैदा करता है के उदाहरण देख सकते:

+0

शानदार जवाब। स्पष्टीकरण के लिए धन्यवाद, यह अब समझ में आता है। मेरी स्थिति के लिए, कोड कोड बनाने के लिए उन दोनों अतिरिक्त पात्रों को हटाने के रूप में यह आसान है (और आयताकार x = नया आयताकार();) सेट करें? – ganders

+1

ईमानदार होने के लिए, मुझे कोई कारण नहीं दिख रहा है कि आपको 'स्थानीय' चर की आवश्यकता है; इसका उपयोग केवल संदर्भ द्वारा 'पेजबाउंड' बनाने के लिए किया जा रहा है। मुझे संदेह है कि यह एक कंपाइलर अनुकूलन था जो डिकंपेलर को भ्रमित कर रहा है। बस 'स्थानीय' को खत्म करें और सीधे एक नया 'पेजबाउंड' बनाएं। –

+0

वास्तव में माइकल की सराहना करते हैं! – ganders

3

यहाँ देखें - http://msdn.microsoft.com/en-us/library/aa664670(v=vs.71).aspx (हालांकि इस्तेमाल कभी नहीं)

The prefix "@" enables the use of keywords as identifiers है, जो उपयोगी होता है जब अन्य प्रोग्रामिंग भाषाओं के साथ इंटरफ़ेस। चरित्र @ वास्तव में पहचानकर्ता का हिस्सा नहीं है, इसलिए पहचानकर्ता को अन्य भाषाओं में उपसर्ग के बिना सामान्य पहचानकर्ता के रूप में देखा जा सकता है। @ उपसर्ग के साथ एक पहचानकर्ता को वर्बैटिम पहचानकर्ता कहा जाता है। पहचानकर्ताओं के लिए @ उपसर्ग का उपयोग जो कीवर्ड नहीं हैं, but strongly discouraged as a matter of style

उदाहरण:

class @class 
{ 
    public static void @static(bool @bool) { 
     if (@bool) 
     System.Console.WriteLine("true"); 
     else 
     System.Console.WriteLine("false"); 
    } 
} 
class Class1 
{ 
    static void M() { 
     cl\u0061ss.st\u0061tic(true); 
    } 
} 
+2

कृपया डाउनवॉटिंग से पहले कारण बताएं। कुछ असली हिम्मत है! –

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