আমি এমএসডিএন-তে এই বাক্য গঠনটি দেখেছি: yield break
তবে এটি কী করে তা আমি জানি না। কেউ কি জানে?
MyList.Add(...)
নেই yield return ...
। আপনার যদি অকাল থেকে লুপটি ভেঙে ফেলার প্রয়োজন হয় এবং আপনি যে ভার্চুয়াল ব্যাকিং yield break;
আমি এমএসডিএন-তে এই বাক্য গঠনটি দেখেছি: yield break
তবে এটি কী করে তা আমি জানি না। কেউ কি জানে?
MyList.Add(...)
নেই yield return ...
। আপনার যদি অকাল থেকে লুপটি ভেঙে ফেলার প্রয়োজন হয় এবং আপনি যে ভার্চুয়াল ব্যাকিং yield break;
উত্তর:
এটি নির্দিষ্ট করে যে কোনও পুনরাবৃত্তির অবসান হয়েছে। আপনি yield break
একটি return
বিবৃতি হিসাবে ভাবতে পারেন যা কোনও মান দেয় না।
উদাহরণস্বরূপ, আপনি যদি একটি ফাংশনকে পুনরুক্তি হিসাবে সংজ্ঞায়িত করেন তবে ফাংশনটির শৃঙ্গটি এটির মতো দেখাবে:
for (int i = 0; i < 5; i++)
{
yield return i;
}
Console.Out.WriteLine("You will see me");
নোট করুন যে লুপটি তার সমস্ত চক্র শেষ করার পরে, শেষ লাইনটি কার্যকর হয়ে যায় এবং আপনি আপনার কনসোল অ্যাপে বার্তাটি দেখতে পাবেন।
বা এর সাথে এটি পছন্দ করুন yield break
:
int i = 0;
while (true)
{
if (i < 5)
{
yield return i;
}
else
{
// note that i++ will not be executed after this
yield break;
}
i++;
}
Console.Out.WriteLine("Won't see me");
এই ক্ষেত্রে সর্বশেষ বিবৃতি কখনই কার্যকর করা হয় না কারণ আমরা প্রথমদিকে ফাংশনটি রেখে দিয়েছি।
break
পরিবর্তে কেবল হতে পারে yield break
? সংকলক তাতে অভিযোগ করে না।
break
এই ক্ষেত্রে @ সরল একটি সাধারণ লুপটি থামিয়ে দেবে, তবে এটি পদ্ধতিটি কার্যকর করা বাতিল করবে না, সুতরাং শেষ পংক্তিটি কার্যকর হবে এবং "আমাকে দেখবেন না" পাঠানোটি আসলে দেখা যাবে।
NullReferenceException
কাছে আইনামেবলের এনুমरेटर পাওয়া যাবে, ফলন বিরতির সাথে আপনি কী করবেন না (কোনও উপাদান নেই এমন উদাহরণ রয়েছে)।
yield return x
সতর্কতা সংকলক ব্যবহার করে আপনি এই পদ্ধতিটি কোনও Enumerator
বস্তু তৈরির জন্য সিনট্যাকটিক চিনি হতে চান । এই গণকের পদ্ধতি MoveNext()
এবং সম্পত্তি রয়েছে Current
। মুভনেক্সট () একটি yield return
বিবৃতি না হওয়া পর্যন্ত পদ্ধতিটি কার্যকর করে এবং সেই মানটিকে রূপান্তর করে Current
। পরের বার মুভনেসেক্স্ট ডাকা হবে, সেখান থেকে কার্যকর করা চলতে থাকবে। yield break
কারেন্টটি শূন্যে সেট করে, এই গণকের শেষের সংকেত দেয়, যাতে একটি foreach (var x in myEnum())
শেষ হয়।
একটি পুনরাবৃত্তকারী ব্লক শেষ করে (উদাঃ আইকনামারেবলের মধ্যে আরও কোনও উপাদান নেই)।
yield
কীওয়ার্ডের সাহায্যে আপনি উভয় দিক থেকে সংগ্রহটি পুনরাবৃত্তি করতে পারবেন, তদুপরি আপনি সংগ্রহের প্রতিটি উপাদান একটি সারিতে নাও নিতে পারেন
yield
এটি করার দরকার নেই। আমি বলছি না যে আপনি ভুল, আমি দেখতে পাচ্ছি আপনি কী পরামর্শ দিচ্ছেন; কিন্তু, একাডেমিকভাবে .NET- তে কোনও পুনরাবৃত্তকারী নেই, কেবল গণক (এক দিক, এগিয়ে) - স্টাডিসি ++ এর বিপরীতে সিটিএস / সিএলআর-তে কোনও "জেনেরিক ইটারেটর ফ্রেমওয়ার্ক" সংজ্ঞায়িত করা হয়নি। লিনকিউ এক্সটেনশন পদ্ধতিগুলির সাথে ব্যবধানটি বন্ধ করতে সহায়তা করে yield return
যা কলব্যাক পদ্ধতিগুলি ব্যবহার করে এবং এটি প্রথম শ্রেণির এক্সটেনশন পদ্ধতি, প্রথম শ্রেণির পুনরাবৃত্তিকারী নয়। IEnumerable
কলকারীকে ফরোয়ার্ড আর্ট করা ব্যতীত অন্য কোনও দিক থেকে ফলাফল নিজেই পুনরাবৃত্তি করতে পারে না।
পুনরাবৃত্তিকে বলে যে এটি শেষ পর্যন্ত পৌঁছেছে।
উদাহরণ হিসাবে:
public interface INode
{
IEnumerable<Node> GetChildren();
}
public class NodeWithTenChildren : INode
{
private Node[] m_children = new Node[10];
public IEnumerable<Node> GetChildren()
{
for( int n = 0; n < 10; ++n )
{
yield return m_children[ n ];
}
}
}
public class NodeWithNoChildren : INode
{
public IEnumerable<Node> GetChildren()
{
yield break;
}
}
yield
মূলত একটি IEnumerable<T>
পদ্ধতিটি একটি সমবায়ভাবে পূর্বনির্ধারিত থ্রেডের সাথে সমানভাবে আচরণ করে।
yield return
সিপিইউর নিয়ন্ত্রণ ছেড়ে দেওয়ার জন্য "সূচি" বা "ঘুম" ফাংশন হিসাবে ডাকে এমন থ্রেডের মতো। একটি থ্রেডের মতোই, IEnumerable<T>
পদ্ধতিটি ঠিক পরে বিন্দুতে নিয়ন্ত্রণগুলি ফিরে পায়, সমস্ত স্থানীয় ভেরিয়েবলগুলির নিয়ন্ত্রণ সমাপ্তির আগে তার মানগুলির সমান হয়।
yield break
এটি তার ফাংশনটির শেষে এবং সমাপ্তির মতো থ্রেডের মতো।
লোকেরা একটি "রাষ্ট্রীয় মেশিন" সম্পর্কে কথা বলে তবে একটি রাষ্ট্রীয় মেশিনটি সমস্ত "থ্রেড" আসলেই। একটি থ্রেডের কিছু স্টেট থাকে (স্থানীয় ভেরিয়েবলের অর্থ), এবং প্রতিটি সময় নির্ধারিত হয়ে গেলে এটি একটি নতুন অবস্থায় পৌঁছাতে কিছু পদক্ষেপ গ্রহণ করে। মূল বিষয়টি yield
হ'ল আমরা যে অপারেটিং সিস্টেমের থ্রেডগুলির ব্যবহার করি তার বিপরীতে, কোডটি যা ব্যবহার করে তা পুনরুক্তি ম্যানুয়ালি উন্নত বা সমাপ্ত না হওয়া পর্যন্ত সময়ে হিমায়িত হয়।
জন স্কিটের গভীরতাতে সি # বইয়ের এই নিখরচায় নমুনা অধ্যায়ে পুনরাবৃত্তকারী ব্লকগুলির পুরো বিষয়টি ভালভাবে কভার করা হয়েছে ।
yield break
বিবৃতি স্টপেজ শুমার ঘটায়। বাস্তবে, yield break
কোনও অতিরিক্ত আইটেম না ফিরিয়ে গণনা সম্পূর্ণ করে।
বিবেচনা করুন যে দুটি উপায় আছে যে কোনও পুনরুক্তি পদ্ধতি পুনরাবৃত্তি থামাতে পারে। একটি ক্ষেত্রে, পদ্ধতির যুক্তি সমস্ত আইটেম ফিরিয়ে দেওয়ার পরে স্বাভাবিকভাবেই পদ্ধতিটি থেকে বেরিয়ে যেতে পারে। এখানে একটি উদাহরণ:
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount)
{
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
}
Debug.WriteLine("All the primes were found.");
}
উপরের উদাহরণে, পুনরুদ্ধারকারী পদ্ধতিটি maxCount
প্রাইমগুলি পাওয়া গেলে স্বাভাবিকভাবেই সম্পাদন বন্ধ করে দেবে ।
yield break
বিবৃতি পুনরুক্তিকারীর enumerating বন্ধ করতে আরেকটি উপায়। এটি প্রথম দিকে গণনা থেকে বেরিয়ে আসার একটি উপায়। এখানে উপরের মত একই পদ্ধতি। এবার, পদ্ধতিটি কার্যকর করতে পারে এমন পরিমাণের একটি পদ্ধতি রয়েছে।
IEnumerable<uint> FindPrimes(uint startAt, uint maxCount, int maxMinutes)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0UL; i < maxCount; i++)
{
startAt = NextPrime(startAt);
yield return startAt;
if (sw.Elapsed.TotalMinutes > maxMinutes)
yield break;
}
Debug.WriteLine("All the primes were found.");
}
কলটি লক্ষ্য করুন yield break
। বাস্তবে, এটি প্রথম দিকে গণনা থেকে প্রস্থান করছে।
এটিও লক্ষ করুন যে yield break
কাজটি কেবল একটি সমতল থেকে আলাদাভাবে কাজ করে break
। উপরের উদাহরণে, yield break
কলটি না করে পদ্ধতিটি প্রস্থান করে Debug.WriteLine(..)
।
এখানে http://www.alteridem.net/2007/08/22/the-yeld-statement-in-c/ খুব ভাল উদাহরণ:
পাবলিক স্ট্যাটিক আইমুনামেবল <দন্ত> ব্যাপ্তি (অন্তর্নিহিত মিনিট, অন্তত সর্বাধিক) { যখন (সত্য) { যদি (সর্বনিম্ন> = সর্বাধিক) { ফলন বিরতি; } ফলন মিনিট ++; } }
এবং ব্যাখ্যা, যে যদি কোনও yield break
পদ্ধতির মধ্যে কোনও বিবৃতি আঘাত করা হয়, তবে সেই পদ্ধতিটি কার্যকর করা কোনও রিটার্ন ছাড়াই বন্ধ হয়ে যায়। কিছু সময়ের পরিস্থিতি রয়েছে, যখন আপনি কোনও ফল দিতে চান না, তখন আপনি ফলন বিরতি ব্যবহার করতে পারেন।
ফলন বিরতি হ'ল শেষ বারের জন্য রিটার্ন বলার উপায় এবং কোনও মান ফেরত দেবে না
যেমন
// returns 1,2,3,4,5
IEnumerable<int> CountToFive()
{
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
yield break;
yield return 6;
yield return 7;
yield return 8;
yield return 9;
}
যদি "ফলন বিরতি আসলে কী করে" বলতে বোঝায়, তবে এটি "এটি কীভাবে কাজ করে" - বিশদ বিবরণের জন্য রেমন্ড চেনের ব্লগটি দেখুন https://devblogs.microsoft.com/oldnewthing/20080812-00/?p=21273
সি # পুনরাবৃত্তিকারীরা খুব জটিল কিছু কোড উত্পন্ন করে।
ফলন কীওয়ার্ডটি ফেরত কীওয়ার্ডের সাথে একত্রে গণকের অবজেক্টকে একটি মান সরবরাহ করতে ব্যবহৃত হয়। ফলন ফেরত মান বা মানগুলি নির্দিষ্ট করে দেয় returned ফলন ফেরতের বিবৃতি পৌঁছে গেলে বর্তমান অবস্থানটি সংরক্ষণ করা হয়। পরের বার পুনরুক্তিকারীকে ডাকা হলে এই অবস্থান থেকে পুনরায় কার্যকর করা হবে।
একটি উদাহরণ ব্যবহার করে অর্থ ব্যাখ্যা করতে:
public IEnumerable<int> SampleNumbers() { int counter = 0; yield return counter; counter = counter + 2; yield return counter; counter = counter + 3; yield return counter ; }
যখন এটি পুনরাবৃত্তি করা হয় তখন মানগুলি হ'ল: 0, 2, 5।
এই উদাহরণে কাউন্টার ভেরিয়েবল স্থানীয় ভেরিয়েবল তা লক্ষ করা গুরুত্বপূর্ণ । দ্বিতীয় পুনরাবৃত্তির যা 2 এর মান পর তৃতীয় পুনরাবৃত্তির যেখানে এটি, আগে বাম যখন স্থানীয় পরিবর্তনশীল নামক পূর্ববর্তী মান সংরক্ষণের থেকে শুরু কাউন্টার যা 2 ছিল।
yield break
করেন তা ব্যাখ্যা করেননি
yield return
বাস্তবে একাধিক মান ফিরিয়ে দেওয়া সমর্থন করে। আপনি সম্ভবত এটি বোঝাতে চেয়েছিলেন না, তবে আমি এটি এটিই পড়ি।
yield break
এটির জন্য এটি একটি দুর্বল উদাহরণ হ'ল কারণ এটিতে কোনও ভাষা-স্তরের গণক থাকে না যেমন foreach
- একটি গণক ব্যবহারের সময় yield break
প্রকৃত মান সরবরাহ করে। এই উদাহরণটি একটি অনিবন্ধিত লুপের মতো দেখাচ্ছে। আপনি বাস্তব কোডটি এই কোডটি প্রায় কখনও দেখতে পাবেন না (আমরা সকলেই কিছু প্রান্তের কেসগুলি সম্পর্কে নিশ্চিত ভাবতে পারি), এছাড়াও এখানে "পুনরাবৃত্তি" নেই। "পুনরাবৃত্তকারী ব্লক" ভাষা নির্দিষ্টকরণের বিষয়টি হিসাবে পদ্ধতিটির বাইরে প্রসারিত করতে পারে না। আসলে যা ফিরিয়ে দেওয়া হচ্ছে এটি একটি "গণনাযোগ্য", এটিও দেখুন: স্ট্যাকওভারফ্লো.com