VB.NET কোডটি সি # তে স্থানান্তরিত করার সময় কেন লুপের জন্য আলাদা আচরণ করে?


87

আমি ভিজ্যুয়াল বেসিক থেকে সি # তে একটি প্রকল্প স্থানান্তর করার প্রক্রিয়াতে রয়েছি এবং কীভাবে একটি forলুপ ব্যবহৃত হচ্ছে তা কীভাবে ঘোষিত হয় তা আমাকে পরিবর্তন করতে হয়েছিল ।

ভিবি.এনইটি-তে 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

সি # তে 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লুপ শর্ত এটা প্রাথমিক স্ট্রিং মান প্রতিটি সময় লুপ ঘটে পরিবর্তন। কেন?


8
মাইক্রোসফ্ট আপনার সমস্যাটি কী তা স্পষ্টভাবে
রূপরেখার

39
@ Ěŕxěŕ: থামুন, দয়া করে। যদি প্রবন্ধ বিবেচনা না করে শিরোনাম থেকে ট্যাগগুলি রোবোটিকালি মুছে ফেলা সহায়ক হয় তবে ওয়েবসাইটটি এটি করবে।
রাই-

11
@ Çöđěxěŕ আপনি যে সম্পর্কে কিছু তথ্য পেতে পারেন এখানে
পুশকিন

35
@ Ěŕxěŕ আমি মনে করি না যে দুটি পোস্টই একে অপরের বিরোধিতা করছে। মুল বক্তব্যটি: "এই জিনিস সম্পর্কে প্রশ্ন - ট্যাগ" এর মতো শিরোনামে বিশ্রীভাবে ট্যাগ আটকাবেন না। তবে যদি শিরোনামটি একটি সম্পূর্ণ বাক্য যাতে ট্যাগ অন্তর্ভুক্ত থাকে তবে এটি কখনও কখনও ঠিক থাকে ok "স্থানান্তরের সময় লুপের জন্য কেন অন্যরকম আচরণ করা হয়" মনে হয় এমন একটি উপায় খুব সাধারণ শিরোনাম।
পুশকিন

26
@ Ěŕxěŕ "VB.NET কোডটি সি # তে স্থানান্তরিত করা" স্পষ্টভাবে একটি সম্পূর্ণ বাক্যাংশ যা শিরোনামে দরকারী তথ্য যুক্ত করে। স্বচ্ছতা হ্রাস এমন সম্পাদনাগুলি করবেন না। আশা করি, এই ধারণাটি যথেষ্ট সাধারণ ধারণা যে এটির ব্যাক আপ করার জন্য আমাদের কোনও মেটা পোস্টের দরকার নেই।
jpmc26

উত্তর:


115

সি # তে, প্রতিটি পুনরাবৃত্তির উপর লুপের সীমানা শর্তটি মূল্যায়ন করা হয়। ভিবি.এনইটি-তে, এটি কেবল লুপে প্রবেশের সময় মূল্যায়ন করা হয়।

সুতরাং, প্রশ্নের সি # সংস্করণে, কারণ লুপটির দৈর্ঘ্য stringValueপরিবর্তন করা হচ্ছে, চূড়ান্ত লুপের পরিবর্তনশীল মানটি পরিবর্তন করা হবে।

ভিবি.নেটে, চূড়ান্ত শর্তটি অন্তর্ভুক্ত, সুতরাং আপনি সি # এর <=পরিবর্তে ব্যবহার করবেন <

সি # তে শেষ শর্তের মূল্যায়ণটিতে এমন এককটি রয়েছে যা এমনকি এটি পৃথক না হলেও এটি গণনা ব্যয়বহুল, তবে এটি লুপের ঠিক আগে একবার গণনা করা উচিত।


জবাবের জন্য ধন্যবাদ. আমি এখন বুঝতে পারি যে <=ব্যবহারটি আমাকে পুনরাবৃত্তি করতে এবং ভিবি কোডের মতো একই আউটপুট পেতে দেয়। তবে কেন আমাকে পূর্ণসংখ্যার ভেরিয়েবল ঘোষণা করতে হয়েছিল এবং এর মধ্যে VBআমার দরকার নেই তা জানার বিষয়ে আমি আরও আগ্রহী । একই আউটপুটটি দেখানোর জন্য আমি আমার প্রশ্নটি আপডেট করতে যাচ্ছি।
sle423

@ sle423 কারণটি আমার উত্তরের প্রথম বাক্যে দেওয়া হয়েছে। লুপটির দৈর্ঘ্য stringValueপরিবর্তিত হওয়ায় চূড়ান্ত লুপের পরিবর্তনশীল মান পরিবর্তন করা হবে।
অ্যান্ড্রু মর্টন

4
দুঃখিত, এই উত্তরের জন্য ধন্যবাদ। এবং আমার জন্য এটি আরও বিস্তারিতভাবে ব্যাখ্যা করার জন্য ধন্যবাদ।
sle423

4
@ sle423 আমি উত্তরটিতে যুক্ত করেছি কারণ এটি এটি স্পষ্ট করে দেয়।
অ্যান্ড্রু মর্টন

22

এখন আমার প্রশ্নটি সমাধান হয়ে যায় যে স্ট্রিংভ্যালু ব্যবহার করে স্ট্রিংভ্যালু ব্যবহার করে কীভাবে ভি # সি এর সাথে সি # এর চেয়ে আলাদা হয় each লুপের জন্য লম্বার শর্তটি প্রতিটি সময় লুপটি স্ট্রিংয়ের দৈর্ঘ্যের পরিবর্তনের পরেও ঘটে।

ভিবি.এনইটি ডকুমেন্টেশন অনুসারে :

আপনি যদি counterকোনও লুপের অভ্যন্তরে থাকা মানটি পরিবর্তন করেন তবে আপনার কোডটি পড়তে এবং ডিবাগ করা আরও কঠিন হতে পারে। এর মান পরিবর্তন করা হচ্ছে start, endঅথবা stepযে যখন লুপ প্রথম প্রবেশ করানো হয় নির্ধারণ করা হয়েছে পুনরাবৃত্তির মান প্রভাবিত করে না।

সুতরাং, এর মান To 10 - stringValue.Lengthএকবারে মূল্যায়ন করা হয় এবং লুপগুলি প্রস্থান না হওয়া অবধি পুনরায় ব্যবহার করা হয়।

তবে বিবৃতি দেওয়ার জন্য সি # এর দিকে তাকান

যদি for_conditionউপস্থিত না থাকে বা মূল্যায়ন ফল দেয় তবে trueনিয়ন্ত্রণ এম্বেড স্টেটমেন্টে স্থানান্তরিত হয়। কখন এবং যদি এমবেড থাকা বিবৃতিটির শেষ পয়েন্টে পৌঁছায় (সম্ভবত একটি চালিয়ে যাওয়া বিবৃতি কার্যকর করা থেকে), এক্সপ্রেশনগুলি for_iterator, যদি থাকে তবে , ক্রমানুসারে মূল্যায়ন করা হয় এবং তারপরে আরও একটি পুনরাবৃত্তি সঞ্চালিত হয়, for_conditionপদক্ষেপের মূল্যায়নের সাথে শুরু করে উপরে।

যার মূল অর্থ ; i <= 10 - stringValueLength;হ'ল শর্তটি প্রতিবারই আবার মূল্যায়ন করা হয়।

সুতরাং, যেমনটি আপনি দেখেছেন, আপনি কোডটি প্রতিলিপি করতে চান, আপনাকে লুপ শুরু করার আগে সি # তে চূড়ান্ত কাউন্টার ঘোষণা করতে হবে।


11

অর্ডার উদাহরণ আরো বোধগম্য করার জন্য, আমি উভয় রূপান্তর করবে loops জন্য মধ্যে সি # যখন loops

ভিবি.এনইটি

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++;
}

পার্থক্যটি হ'ল:

ভিবি.এনইটি সর্বোচ্চ মানটিকে ক্যাশে করে iতবে সি # প্রতিবারই এটির সংশোধন করে।



10
এটি for loopsআমার শুরুতে আমাকে বুঝতে সাহায্য করেছিল , আমি মনে করি তারা অনেক বেশি বোধগম্য। এই কারণেই while loopsবোঝার জন্য আমি উদাহরণগুলিতে 'অনুবাদ' করেছি ।
ম্যাক্সিমাম রেকুর্দা

7

কারণ forভি ভি forইন সি # (বা অন্য কোনও সি-এর মতো ভাষা) এর চেয়ে আলাদা শব্দার্থক

ভিবিতে, forবিবৃতিটি একটি মান থেকে অন্য মানে বিশেষভাবে কাউন্টারকে বাড়িয়ে দিচ্ছে।

সি, সি ++, সি # ইত্যাদি ইত্যাদিতে forবিবৃতিটি কেবল তিনটি এক্সপ্রেশনকে মূল্যায়ন করে:

  • প্রথম অভিব্যক্তিটি প্রথাগতভাবে একটি সূচনা হয়
  • টার্মিনাল শর্ত পূরণ হয়েছে কিনা তা নির্ধারণ করতে প্রতিটি পুনরাবৃত্তির শুরুতে দ্বিতীয় এক্সপ্রেশনটি মূল্যায়ন করা হয়
  • তৃতীয় এক্সপ্রেশন প্রতিটি পুনরাবৃত্তির শেষে মূল্যায়ন করা হয়, যা সাধারনত একটি ইনক্রিমেন্টার।

ভিবিতে, আপনাকে অবশ্যই একটি সংখ্যাসূচক ভেরিয়েবল সরবরাহ করতে হবে যা একটি টার্মিনাল মানের সাথে পরীক্ষা করা যেতে পারে এবং প্রতিটি পুনরাবৃত্তিতে বাড়ানো হয়

সি, সি ++, সি # ইত্যাদি ইত্যাদিতে তিনটি এক্সপ্রেশন ন্যূনতমভাবে সীমাবদ্ধ; শর্তসাপেক্ষ প্রকাশটি অবশ্যই সত্য / মিথ্যা (অথবা সি, সি ++ তে পূর্ণসংখ্যা শূন্য / অ-শূন্য) এর মূল্যায়ন করতে হবে। আপনার মোটেও একটি সূচনা করার দরকার নেই, আপনি কোনও মানের যে কোনও পরিসর ধরে কোনও ধরণের পুনরাবৃত্তি করতে পারেন, কোনও জটিল কাঠামোর উপরে কোনও পয়েন্টার বা রেফারেন্স পুনরাবৃত্তি করতে পারেন, বা কিছুতেই পুনরাবৃত্তি করতে পারবেন না।

সুতরাং, সি #, ইত্যাদিতে শর্তের অভিব্যক্তি অবশ্যই প্রতিটি পুনরাবৃত্তির উপর সম্পূর্ণ মূল্যায়ন করা উচিত, তবে ভিবিতে, পুনরাবৃত্তির টার্মিনাল মানটি শুরুতে মূল্যায়ন করা উচিত, এবং আবার মূল্যায়ন করার প্রয়োজন নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.