जब VB.NET कोड C # पर माइग्रेट हो रहा है, तो लूप के लिए अलग तरीके से व्यवहार क्यों किया जाता है?


87

मैं किसी प्रोजेक्ट को Visual Basic से C # में माइग्रेट करने की प्रक्रिया में हूं और मुझे यह बदलना होगा कि कैसे forइस्तेमाल किया जा रहा लूप घोषित किया जाता है।

VB.NET में forलूप नीचे घोषित किया गया है:

Dim stringValue As String = "42"

For i As Integer = 1 To 10 - stringValue.Length
   stringValue = stringValue & " " & CStr(i)
   Console.WriteLine(stringValue)
Next

कौन से आउटपुट:

42 1
42 1 2
42 1 2 3
42 1 2 3 4
42 1 2 3 4 5
42 1 2 3 4 5 6
42 1 2 3 4 5 6 7
42 1 2 3 4 5 6 7 8

C # में forलूप नीचे घोषित किया गया है:

string stringValue = "42";

for (int i = 1; i <= 10 - stringValue.Length; i ++)
{
   stringValue = stringValue + " " + i.ToString();
   Console.WriteLine(stringValue);
}

और आउटपुट:

42 1
42 1 2
42 1 2 3

यह स्पष्ट रूप से सही नहीं है इसलिए मुझे कोड को कभी थोड़ा बदलना पड़ा और इसमें एक पूर्णांक चर शामिल किया गया जो स्ट्रिंग की लंबाई को पकड़ता है।

कृपया नीचे कोड देखें:

string stringValue = "42";
int stringValueLength = stringValue.Length;

for (int i = 1; i <= 10 - stringValueLength; i ++)
{
   stringValue = stringValue + " " + i.ToString();
   Console.WriteLine(stringValue);
}

और आउटपुट:

42 1
42 1 2
42 1 2 3
42 1 2 3 4
42 1 2 3 4 5
42 1 2 3 4 5 6
42 1 2 3 4 5 6 7
42 1 2 3 4 5 6 7 8

अब मेरा प्रश्न यह है कि विज़ुअल बेसिक के संदर्भ में विजुअल बेसिक के संदर्भ में लूप stringValue.Lengthमें भिन्नता का उपयोग करते हुए forहर बार लूप कैसे बदल जाता है, जबकि हर बार लूप में स्ट्रिंग में परिवर्तन होता है। जबकि C # में अगर मैं लूप की स्थिति stringValue.Lengthमें उपयोग करता हूं तो forयह लूप होने पर हर बार प्रारंभिक स्ट्रिंग मान को बदल देता है। ऐसा क्यों है?


7
Microsoft स्पष्ट रूप से बताता है कि आपकी समस्या क्या है ...
đěöěŕx

39
@ @ÖÇxěŕ: बंद करो, कृपया। यदि संदर्भ के संबंध में शीर्षक से रोबोटिक रूप से टैग हटाने में सहायक होते हैं, तो वेबसाइट ऐसा करेगी।
Ry-

11
@ Aboutö thatxěŕ आप इसके बारे में कुछ जानकारी यहाँ
pushkin

35
@ Twoö postsxěŕ मुझे नहीं लगता कि दोनों पद एक दूसरे के विपरीत हैं। मुद्दा यह है: शीर्षक में "इस बात के बारे में सवाल - टैग" जैसे टैग को अजीब तरह से न चिपकाएं। लेकिन अगर शीर्षक एक पूर्ण वाक्य है जिसमें टैग शामिल है, तो यह कभी-कभी ठीक है। "लूप के लिए अलग तरीके से व्यवहार क्यों किया जाता है जब माइग्रेट करना" एक तरह से बहुत सामान्य शीर्षक जैसा लगता है।
पुशकिन

26
@ Bö.NETxěŕ "VB.NET कोड को C #" माइग्रेट करना स्पष्ट रूप से एक पूर्ण वाक्यांश है जो शीर्षक में उपयोगी जानकारी जोड़ता है। स्पष्टता को कम करने वाले संपादन न करें। उम्मीद है, यह धारणा काफी सामान्य है कि हमें इसे वापस करने के लिए मेटा पोस्ट की आवश्यकता नहीं है।
jpmc26

जवाबों:


115

सी # में, लूप सीमा की स्थिति का मूल्यांकन प्रत्येक पुनरावृत्ति पर किया जाता है। VB.NET में, यह केवल लूप में प्रवेश पर मूल्यांकन किया जाता है।

तो, प्रश्न में C # संस्करण में, क्योंकि लंबाई stringValueको लूप में बदला जा रहा है, अंतिम लूप चर मान को बदल दिया जाएगा।

VB.NET में, अंतिम स्थिति समावेशी है, इसलिए आप C # के <=बजाय इसका उपयोग करेंगे <

C # में अंतिम स्थिति मूल्यांकन में कोरोलरी है कि भले ही यह अलग-अलग न हो, लेकिन गणना करना महंगा है, फिर इसे लूप से ठीक पहले एक बार गणना की जानी चाहिए।


उत्तर के लिए धन्यवाद। मुझे अब एहसास हुआ कि उपयोग <=करने से मुझे पुनरावृत्त होने की अनुमति मिलती है और वीबी कोड के समान आउटपुट होता है। हालाँकि, मुझे यह जानने में अधिक दिलचस्पी है कि मुझे पूर्णांक चर क्यों घोषित करना पड़ा और VBमुझे इसमें नहीं आना पड़ा । मैं उसी आउटपुट को दिखाने के लिए अपने प्रश्न को अपडेट करने जा रहा हूं।
स्लीप 423

@ Sle423 मेरे उत्तर के पहले वाक्य में कारण दिया गया है। क्योंकि stringValueलूप की लंबाई को बदला जा रहा है, अंतिम लूप वेरिएबल वैल्यू को बदल दिया जाएगा।
एंड्रयू मॉर्टन

1
माफी, उस जवाब के लिए धन्यवाद। और मेरे लिए इसे और अधिक विस्तार से बताने के लिए धन्यवाद।
स्लीप 423

1
@ आस्तीन 423 मैंने इसे उत्तर में जोड़ा क्योंकि यह वास्तव में इसे स्पष्ट करता है।
एंड्रयू मॉर्टन

22

अब मेरा प्रश्न घूमता है कि कैसे VB स्ट्रिंग के लिए VV के संदर्भ में V # के संदर्भ में C # से भिन्न होता है। लूप के लिए लय में हर बार भले ही लूप में परिवर्तन होता है।

VB.NET प्रलेखन के अनुसार :

यदि आप counterलूप के अंदर के मूल्य को बदलते हैं , तो आपका कोड पढ़ना और डीबग करना अधिक कठिन हो सकता है। के मान का बदलना start, endया stepकि जब पाश पहले दर्ज किया गया था निर्धारित किया गया है यात्रा मूल्यों को प्रभावित नहीं करता।

इसलिए, To 10 - stringValue.Lengthएक बार मूल्यांकन किया जाता है और छोरों से बाहर निकलने तक पुन: उपयोग किया जाता है।

हालाँकि, कथन के लिए c # को देखें

यदि for_conditionमौजूद नहीं है या यदि मूल्यांकन पैदावार देता है true, तो नियंत्रण को एम्बेडेड स्टेटमेंट में स्थानांतरित कर दिया जाता है। कब और यदि नियंत्रण एम्बेडेड स्टेटमेंट के अंतिम बिंदु तक पहुंचता है (संभवतः एक जारी स्टेटमेंट के निष्पादन से), के भाव for_iterator, यदि कोई हो, का मूल्यांकन अनुक्रम में किया जाता है, और फिर एक और पुनरावृत्ति का प्रदर्शन किया जाता है, for_conditionकदम में मूल्यांकन के साथ शुरू होता है। ऊपर।

जिसका मूल रूप से मतलब है कि ; i <= 10 - stringValueLength;हर बार स्थिति का मूल्यांकन किया जाता है।

इसलिए, जैसा कि आपने देखा, यदि आप कोड को दोहराना चाहते हैं, तो आपको लूप शुरू करने से पहले c # में अंतिम काउंटर घोषित करना होगा।


11

आदेश उदाहरण अधिक समझ में आता है बनाने के लिए, मैं दोनों में परिवर्तित कर देंगे छोरों के लिए में सी # while लूप में

VB.NET

string stringValue = "42";

int min = 1;
int max = 10 - stringValue.Length;
int i = min;
while (i <= max)
{
    stringValue = stringValue + " " + stringValue.Length.ToString();
    Console.WriteLine(stringValue);
    i++;
}

सी#

string stringValue = "42";

int i = 1;
while (i <= 10 - stringValue.Length)
{
    stringValue = stringValue + " " + stringValue.Length.ToString();
    Console.WriteLine(stringValue);
    i++;
}

अंतर तब है:

VB.NET अधिकतम मूल्य के लिए कैश करता है i, लेकिन C # इसे हर बार पुन: बनाता है।


2
आपको छोरों को धर्मांतरित करने की आवश्यकता नहीं है
पैनागोटिस कानवास

10
इससे मुझे for loopsअपनी शुरुआत में समझने में मदद मिली , मुझे लगता है कि वे बहुत अधिक समझने योग्य हैं। यही कारण है कि मैंने while loopsसमझने में मदद करने के लिए उदाहरणों का 'अनुवाद' किया ।
मैक्सिमे रिकुर्दा

7

क्योंकि forVB forC # (या किसी अन्य C- जैसी भाषा) की तुलना में एक अलग शब्दार्थ है।

वीबी में, forबयान विशेष रूप से एक मूल्य से दूसरे मूल्य के काउंटर में वृद्धि कर रहा है।

C, C ++, C #, आदि में, forकथन केवल तीन भावों का मूल्यांकन करता है:

  • पहली अभिव्यक्ति को प्रारंभिक रूप से एक इनिशियलाइज़ेशन है
  • दूसरी अभिव्यक्ति का मूल्यांकन प्रत्येक पुनरावृत्ति की शुरुआत में यह निर्धारित करने के लिए किया जाता है कि क्या टर्मिनल की शर्त पूरी की गई है
  • तीसरी अभिव्यक्ति का मूल्यांकन प्रत्येक पुनरावृत्ति के अंत में किया जाता है, जो कस्टम रूप से एक वृद्धिशील है।

VB में, आपको एक न्यूमेरिक वैरिएबल की आपूर्ति करनी चाहिए जिसे टर्मिनल वैल्यू के विरुद्ध टेस्ट किया जा सकता है और प्रत्येक पुनरावृत्ति पर इंक्रीमेंट किया जा सकता है

सी, सी ++, सी #, आदि में, तीन अभिव्यक्तियाँ न्यूनतम रूप से विवश हैं; सशर्त अभिव्यक्ति को एक सच्चे / झूठे (या पूर्णांक शून्य / गैर-शून्य में C, C ++) का मूल्यांकन करना चाहिए। आपको किसी भी तरह का इनिशियलाइज़ेशन करने की आवश्यकता नहीं है, आप किसी भी प्रकार के मानों पर किसी भी प्रकार से पुनरावृति कर सकते हैं, एक जटिल संरचना पर एक पॉइंटर या संदर्भ को पुनरावृत्त कर सकते हैं, या किसी भी चीज़ को पुनरावृत्त नहीं कर सकते।

तो, C #, आदि में, प्रत्येक अभिव्यक्ति पर पूरी तरह से स्थिति की अभिव्यक्ति का मूल्यांकन किया जाना चाहिए, लेकिन VB में, इट्रेटर के टर्मिनल मूल्य का मूल्यांकन शुरुआत में किया जाना चाहिए, और फिर से मूल्यांकन करने की आवश्यकता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.