2009-10-28 32 views
9

.NET 4 बीटा 2 में, struct BigInteger के साथ नया न्यूमेरिक्स नेमस्पेस है। documentation बताता है कि यह एक अपरिवर्तनीय प्रकार है, जैसा कि मैंने अपेक्षा की थी।बिगइंटर अपरिवर्तनीय है या नहीं?

लेकिन मैं बाद में वृद्धि ऑपरेटर (++) द्वारा थोड़ा उलझन में हूं। यह निश्चित रूप से मूल्य को बदलना प्रतीत होता है। निम्नलिखित जबकि पाश काम करता है:

क्योंकि BigInteger वस्तुओं अपरिवर्तनीय हैं, वृद्धि ऑपरेटर एक नया BigInteger वस्तु जिसका बनाता है:

static BigInteger Factorial(BigInteger n) 
{ 
    BigInteger result = BigInteger.One; 
    BigInteger b = BigInteger.One; 

    while (b <= n) 
    { 
     result = result * b; 
     b++; // immutable ? 
    } 
    return result; 
} 

यह MSDN क्या बढ़ते क्रम में ऑपरेटर के बारे में क्या कहना है है मूल्य बिगइंटर ऑब्जेक्ट द्वारा मूल्य से अधिक एक है। इसलिए, वृद्धि बढ़ाने के लिए बार-बार कॉल महंगा हो सकता है।

सभी अच्छी तरह से और ठीक है, मैं अगर मैं b = b++ का इस्तेमाल किया था लेकिन जाहिरा तौर पर ++ अपने आप में एक मूल्य बदलने के लिए पर्याप्त है समझ में आ गया होगा।

कोई विचार?

संपादित करें:
लास के मुताबिक, step-by-step specification है कि कैसे पोस्ट-वृद्धि कार्य करता है। लेकिन यह अभी भी अपरिवर्तनीयता के साथ बाधाओं को लगता है। उदाहरण के लिए, मैं कल्पना नहीं कर सकता कि इस ऑपरेटर का उपयोग थ्रेड-सुरक्षित है।

उत्तर

13

ऑपरेटरों ++ और -- सामान्य + और - ऑपरेटरों के मामले में लागू किया जाता है, तो वास्तव में:

var temp = b; 
b = b + 1; 
<use temp for the expression where b++ was located> 

अब, के रूप में टिप्पणी की, यह हो सकता है:

b++; 

के बराबर है ऐसा लगता है कि यह अपरिवर्तनीयता तोड़ता है, लेकिन यह नहीं करता है।

इसके बजाय आप यह कर के रूप में इस कोड को देखना चाहिए:

var temp = b; 
b = BigInteger.op_Add(b, 1); // constructs a new BigInteger value 
<use temp ...> 

यह स्मृति में दो वस्तुओं छोड़ देंगे, मूल BigInteger मूल्य, और नया एक, अब ख द्वारा संदर्भित। आप आसानी से देख सकते हैं कि यह क्या निम्न कोड के साथ होता है:

var x = b; 
b++; 
// now inspect the contents of x and b, and you'll notice that they differ 

तो मूल वस्तु परिवर्तन नहीं किया, इसलिए यह अचल स्थिति को तोड़ने नहीं है, और प्रश्न के नए हिस्से जवाब देने के लिए, इस सूत्र होना चाहिए -सुरक्षित।

यह एक ही बात है कि तार करने के लिए होता है:

String s1 = s2; 
s2 += "More"; 
// now inspect s1 and s2, they will differ 
+0

उचित लगता है, लेकिन यह अभी भी अपरिवर्तनीयता को तोड़ता है। मैं सवाल थोड़ा सा संपादित करूंगा। –

+1

नहीं, यह अपरिवर्तनीयता को तोड़ता नहीं है, मुझे अपना उत्तर अपडेट करने दें। –

+2

's + = s2' में एक दृश्य असाइनमेंट है। यह फिट बैठता है अगर आप स्वीकार करते हैं कि 'बी ++' एक असाइनमेंट भी है, यानी 'बी = बी + 1'। लेकिन '++' अभी भी लगता है/ऐसा लगता है कि यह उत्परिवर्तित है। –

3

BigInteger के बाद से, अपरिवर्तनीय है ख ++ बस के बराबर होगी:

BigInteger temp=b; 
b=temp+1; 

इस आपरेशन के बाद, अस्थायी जीसी द्वारा पुनर्नवीनीकरण और स्मृति मुक्त है।

+1

ठीक है, जीसी भाग को छोड़कर। यह एक संरचना है (एक आंतरिक सरणी के साथ)। –

+0

हां, और केवल अंतर यह है कि संरचना ढेर पर संग्रहीत होती है जबकि इस वर्ग को ढेर में संग्रहीत किया जाता है। –

+0

टेड, आपको लगता है कि किसी ऑब्जेक्ट में BigInteger फ़ील्ड संग्रहीत है? –

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