C# లూప్స్ (for, while, do-while, foreach) — సమగ్ర పునరావృతాల గైడ్
స్వాగతం అధ్యాయం 07 కి! 🔁 పునరావృతాల శక్తి & ఆధునిక C# ఇటరేషన్ సిస్టమ్
ఒక మనిషి ఒకే పనిని 10 సార్లు చేస్తే విసుగు చెందుతాడు, 100 సార్లు చేస్తే అలసిపోతాడు, 10,000 సార్లు చేయాల్సి వస్తే తప్పులు చేయడం మొదలుపెడతాడు. కానీ ఒక కంప్యూటర్ చిప్ యొక్క గొప్పతనం ఏమిటంటే — అది ఒకే పనిని ఒక కోటి (10 మిలియన్) సార్లు కూడా ఒక్క మైక్రోసెకనులో, ఎటువంటి అలసట లేదా పొరపాటు లేకుండా ఖచ్చితత్వంతో చేయగలదు!
కంప్యూటర్ల ఈ సూపర్-పవర్కు మూలస్తంభం లూప్స్ (Loops). లక్షల మంది కస్టమర్ల బ్యాంక్ స్టేట్మెంట్స్ ప్రాసెస్ చేయడం నుండి, వీడియో గేమ్ లో ప్రతి ఫ్రేమ్ను సెకనుకు 120 సార్లు రెండర్ చేయడం వరకు ప్రపంచంలోని ప్రతి సాఫ్ట్వేర్ లూప్లపైనే నడుస్తుంది.
C# భాషలో 4 ప్రధాన లూప్ రకాలు ఉన్నాయి: for, while, do-while, మరియు .NET యొక్క అత్యంత ప్రియమైన కలెక్షన్ ఇటరేటర్ foreach. ఈ అధ్యాయంలో మనం ప్రతి లూప్ యొక్క అంతర్గత ఆర్కిటెక్చర్, JIT Bounds Check Elimination, IEnumerable ఇంటర్నల్స్, మరియు జీరో-మెమరీ కాపీయింగ్ టెక్నిక్స్ నేర్చుకొని — ఒక రియల్-వరల్డ్ మ్యూచువల్ ఫండ్ SIP కాంపౌండ్ వెల్త్ సిమ్యులేటర్ను నిర్మిస్తాం!
1 🔁 కంప్యూటింగ్ ప్రపంచంలో పునరావృతాల శక్తి & CPU సైకిల్స్
ఒక వేరియబుల్లోని నంబర్ను 1 నుండి 100 వరకు ప్రింట్ చేయడానికి మనం 100 సార్లు Console.WriteLine(1); Console.WriteLine(2); ... అని రాసుకుంటూ వెళ్తే అది కోడ్ కాదు, ఒక డిజాస్టర్! కోడ్ పరిమాణం విపరీతంగా పెరగడమే కాకుండా, దాన్ని భవిష్యత్తులో మార్చడం అసాధ్యం.
లూప్స్ (Loops) అనేవి DRY ప్రిన్సిపల్ (Don't Repeat Yourself) కు ప్రత్యక్ష నిరూపణ. ఒకే కోడ్ బ్లాక్ను నిర్దిష్ట షరతు నెరవేరే వరకు పదే పదే ఎగ్జిక్యూట్ చేయడానికి లూప్స్ ఉపయోగపడతాయి.
హార్డ్వేర్ స్థాయిలో అసెంబ్లీ కోడ్లో ప్రత్యేకమైన లూప్ ఇన్స్ట్రక్షన్స్ ఉంటాయి (ఉదా: JMP, JNE - Jump if Not Equal). కండిషన్ ట్రూ అయిన ప్రతిసారీ CPU యొక్క Instruction Pointer (IP) తిరిగి లూప్ ప్రారంభ అడ్రస్కు వెనక్కి దూకుతుంది. ఈ సర్కిల్ నిరంతరం తిరుగుతూ ఉంటుంది.
2 🔄 for లూప్ — కౌంటర్ బేస్డ్ ఇటరేషన్ (The Workhorse)
ఒక పని ఎన్నిసార్లు జరగాలో మనకు ముందే కచ్చితంగా తెలిసినప్పుడు (ఉదాహరణకు: 10 సార్లు లేదా అర్రే పొడవు N సార్లు), for లూప్ అత్యంత సరైన ఎంపిక.
for లూప్ ఒకే లైన్లో 3 కీలక భాగాలను కలిగి ఉంటుంది:
- ఇనిషియలైజేషన్: లూప్ మొదలయ్యే ముందు కేవలం ఒక్కసారి మాత్రమే ఎగ్జిక్యూట్ అవుతుంది (ఉదా:
int i = 0;). - కండిషన్: ప్రతి రౌండ్ (ఇటరేషన్) ప్రారంభంలో తనిఖీ చేయబడుతుంది. ఇది
trueఅయితేనే లోపలి బాడీ రన్ అవుతుంది,falseఅయితే లూప్ ఆగిపోతుంది. - ఇంక్రిమెంట్/డిక్రిమెంట్: లూప్ బాడీ పూర్తయిన తర్వాత ప్రతిసారీ కౌంటర్ విలువను మారుస్తుంది (ఉదా:
i++లేదాi += 2).
// 1. సాధారణ 1 నుండి 5 వరకు ప్రింట్ చేయడం
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"రౌండ్ సంఖ్య: {i}");
}
// 2. మల్టిపుల్ వేరియబుల్స్ ఒకే లూప్ లో (రెండు వైపుల నుండి కౌంటర్ నడపడం)
Console.WriteLine("\nరెండు కౌంటర్లు సమాంతరంగా:");
for (int left = 0, right = 10; left < right; left++, right--)
{
Console.WriteLine($"Left: {left} <---> Right: {right}");
}
3 ⏳ while లూప్ — ఎంట్రీ-కంట్రోల్డ్ కండిషనల్ ఇటరేషన్
లూప్ ఎన్నిసార్లు తిరగాలో ముందే తెలియక, ఒక నిర్దిష్ట పరిస్థితి లేదా స్థితి (State) మారేంతవరకు తిరగాల్సి వచ్చినప్పుడు while లూప్ వాడాలి.
ఇది ఎంట్రీ-కంట్రోల్డ్ లూప్ (Entry-Controlled Loop). అంటే లోపలికి ప్రవేశించే ముందే షరతును పరీక్షిస్తుంది. మొదటిసారే షరతు అబద్ధమైతే (false), లూప్ బాడీ ఒక్కసారి కూడా రన్ కాదు!
int batteryPercent = 100;
// బ్యాటరీ 20% కంటే ఎక్కువ ఉన్నంతవరకు ఫోన్ నడుస్తుంది
while (batteryPercent > 20)
{
Console.WriteLine($"🔋 బ్యాటరీ లెవెల్: {batteryPercent}% - ఫోన్ సజావుగా పనిచేస్తోంది.");
batteryPercent -= 25; // 25% తగ్గుతూ వస్తుంది
}
Console.WriteLine($"⚠️ లో బ్యాటరీ హెచ్చరిక! మిగిలినది: {batteryPercent}%. దయచేసి ఛార్జర్ కనెక్ట్ చేయండి.");
4 🚪 do-while లూప్ — ఎగ్జిట్-కంట్రోల్డ్ (కనీసం ఒక్కసారి గ్యారెంటీ)
కండిషన్ నిజమైనా అబద్ధమైనా సరే — బాడీ కనీసం ఒక్కసారైనా ఖచ్చితంగా ఎగ్జిక్యూట్ అవ్వాలి అనుకున్నప్పుడు do-while లూప్ ఉపయోగిస్తారు.
ఇది ఎగ్జిట్-కంట్రోల్డ్ లూప్ (Exit-Controlled Loop). అంటే కోడ్ బాడీ పూర్తయిన తర్వాత మాత్రమే ఆఖరున షరతును తనిఖీ చేస్తుంది.
నిజ జీవిత ఉదాహరణ: ATM మెషిన్ వద్ద పిన్ అడగడం. యూజర్ సరైన పిన్ కొట్టాడో లేదో తెలియాలంటే మొదట కనీసం ఒక్కసారైనా పిన్ ఎంటర్ చేయమని అడగాలి కదా!
int attempts = 0;
bool isPinCorrect = false;
int dummyInputPin = 1234;
do
{
attempts++;
Console.WriteLine($"ప్రయత్నం #{attempts}: దయచేసి మీ 4-అంకెల పిన్ నమోదు చేయండి...");
// అనుకరణ కోసం 3వ ప్రయత్నంలో కరెక్ట్ పిన్ వచ్చింది అనుకుందాం
if (attempts == 3)
{
isPinCorrect = true;
}
} while (!isPinCorrect && attempts < 3);
if (isPinCorrect)
{
Console.WriteLine("✅ లాగిన్ విజయవంతమైంది! మీ ఖాతా తెరవబడింది.");
}
else
{
Console.WriteLine("🚨 3 సార్లు తప్పు పిన్ కొట్టారు. కార్డు 24 గంటలు బ్లాక్ చేయబడింది.");
}
సింటాక్స్ గమనిక: do { ... } while (condition); లో చివర తప్పనిసరిగా సెమీకోలన్ (;) ఉండాలి.
5 ⚡ foreach లూప్ & IEnumerable అండర్ ది హుడ్ మెకానిజం
C# లో ఒక అర్రే (Array), లిస్ట్ (List), లేదా ఏదైనా డేటా కలెక్షన్ మీదుగా ప్రయాణించడానికి foreach లూప్ అత్యంత సురక్షితమైన మరియు ప్రజాదరణ పొందిన మార్గం.
ఇక్కడ ఇండెక్స్ i = 0; i < length లాంటి కౌంటర్లతో తలనొప్పి ఉండదు. కలెక్షన్లో ఎన్ని వస్తువులు ఉన్నాయో వాటన్నింటినీ మొదటి నుండి చివరి వరకు ఆటోమేటిక్గా రీడ్ చేస్తుంది.
string[] programmingLanguages = { "C#", "Python", "Go", "Rust", "TypeScript" };
foreach (string lang in programmingLanguages)
{
Console.WriteLine($"🚀 నేర్చుకుంటున్న ప్రోగ్రామింగ్ భాష: {lang}");
}
🧠 అండర్ ది హుడ్: C# కంపైలర్ foreach ని ఎలా మార్చుకుంటుంది?
నిజానికి CLR (Common Language Runtime) కి foreach అంటే ఏమిటో నేరుగా తెలియదు! C# కంపైలర్ foreach ను అంతర్గతంగా IEnumerable / IEnumerator మరియు ఒక while లూప్ గా మారుస్తుంది:
// కంపైలర్ సృష్టించే అసలైన అంతర్గత కోడ్ (Decompiled Equivalent):
var enumerator = programmingLanguages.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
string lang = (string)enumerator.Current;
Console.WriteLine($"లాంగ్వేజ్: {lang}");
}
}
finally
{
(enumerator as IDisposable)?.Dispose(); // రిసోర్సెస్ క్లీనప్
}
foreach (var item in list) లోపల item = 5; అని మార్చడానికి వీల్లేదు (ఇటరేషన్ వేరియబుల్ Read-Only). అలాగే లూప్ తిరుగుతున్నప్పుడు list.Add() లేదా list.Remove() చేస్తే రన్టైమ్లో InvalidOperationException: Collection was modified వచ్చి క్రాష్ అవుతుంది!
6 📈 పెర్ఫార్మెన్స్ యుద్ధం: for vs foreach vs Bounds Check Elimination
హై-పెర్ఫార్మెన్స్ సాఫ్ట్వేర్ రాసేటప్పుడు "for ఫాస్టా? లేక foreach ఫాస్టా?" అనే చర్చ ఎప్పుడూ నడుస్తూ ఉంటుంది.
- సాధారణ అర్రేస్ (Single-dimensional Arrays): ఆధునిక C# లో సాధారణ అర్రేలపై
foreachరాసినా సరే, కంపైలర్ దాన్ని నేరుగా ఆప్టిమైజ్డ్ ఇండెక్స్డ్forలూప్గా మార్చేస్తుంది. కాబట్టి రెండింటి వేగం 100% సమానం! - JIT Bounds Check Elimination (BCE): ఒకవేళ మీరు
for (int i = 0; i < arr.Length; i++)అని రాస్తే, .NET JIT కంపైలర్ అర్రే సైజును గుర్తిస్తుంది. ప్రతి రౌండ్లోనూarr[i]బౌండ్రీ దాటిపోయిందేమో అని చెక్ చేసే ఓవర్హెడ్ను పూర్తిగా తొలగించేస్తుంది (Bounds Check Elimination). - List<T> మరియు ఇతరులు: లిస్ట్లపై
forలూప్ కొద్దిగా వేగంగా పనిచేస్తుంది ఎందుకంటే ఎన్యుమరేటర్ ఆబ్జెక్ట్ క్రియేట్ కాదు.
7 ♾️ ఇన్ఫినిట్ లూప్స్ (Infinite Loops: while true vs for ;;)
ఒక లూప్ ఎప్పటికీ ఆగకుండా నిరంతరం తిరుగుతూ ఉంటే దానిని ఇన్ఫినిట్ లూప్ (Infinite Loop) అంటారు.
ఇది పొరపాటున జరిగితే కంప్యూటర్ CPU ఫ్యాన్ జోరుగా తిరిగి 100% హాంగ్ అయిపోతుంది. కానీ ఉద్దేశపూర్వకంగా ఈ క్రింది సందర్భాలలో ఇన్ఫినిట్ లూప్స్ వాడతారు:
- ఆపరేటింగ్ సిస్టమ్ కెర్నల్: కంప్యూటర్ ఆఫ్ చేసే వరకు ఓఎస్ రన్ అవుతూనే ఉండాలి.
- వెబ్ సర్వర్లు (Kestrel / IIS): యూజర్ రిక్వెస్ట్ల కోసం 24/7 పోర్ట్ 80/443 పై నిరంతరం వేచి చూడాలి.
- గేమ్ ఇంజిన్స్ (Unity Update Loop): ప్రతి సెకనుకు ప్లేయర్ మూవ్మెంట్స్ విశ్లేషించాలి.
// Style 1: అత్యంత ప్రజాదరణ పొందిన while(true)
int tickCount = 0;
while (true)
{
tickCount++;
if (tickCount == 3) break; // రక్షణ బ్రేక్
}
// Style 2: C-స్టైల్ శాశ్వత లూప్ for (;;)
for (;;)
{
Console.WriteLine("సర్వర్ రన్ అవుతోంది...");
break; // ఎగ్జిట్
}
8 🧵 మోడ్రన్ C# లో ref foreach & Zero-Copy Iteration
C# 7.3 మరియు 8+ లో మైక్రోసాఫ్ట్ మెమరీ అలోకేషన్స్ తగ్గించడానికి Span<T> మరియు ref readonly foreach లను ప్రవేశపెట్టింది.
భారీ స్ట్రక్ట్స్ (Large Structs) లేదా కోట్ల కొద్దీ డేటా పాయింట్లు ఉన్నప్పుడు, ప్రతి ఐటెమ్ను కాపీ చేయకుండా నేరుగా మెమరీ రిఫరెన్స్ ద్వారా లూప్ తిప్పవచ్చు:
Span<int> memoryBlock = stackalloc int[] { 10, 20, 30, 40 };
// జీరో కాపీ ఇటరేషన్: డేటా కాపీ అవ్వదు, కేవలం మెమరీ పాయింటర్ ద్వారా రీడ్ అవుతుంది
foreach (ref readonly var value in memoryBlock)
{
Console.WriteLine($"మెమరీ విలువ: {value}");
}
9 📊 తులనాత్మక పట్టిక: for vs while vs do-while vs foreach
నాలుగు లూప్ల లక్షణాలు మరియు సరిపోయే వినియోగ సందర్భాలు:
| లూప్ రకం | కండిషన్ చెక్ సమయం | కనీస ఎగ్జిక్యూషన్లు | ఇండెక్స్ యాక్సెస్ | ఉత్తమ వినియోగ సందర్భం |
|---|---|---|---|---|
| for | ప్రారంభంలో (Pre-test) | 0 సార్లు | అవును (i ద్వారా నేరుగా యాక్సెస్) | ఇటరేషన్ల సంఖ్య ముందే తెలిసినప్పుడు, అర్రే మోడిఫికేషన్స్ కు |
| while | ప్రారంభంలో (Pre-test) | 0 సార్లు | మాన్యువల్గా మెయింటైన్ చేయాలి | పరిస్థితి ఎప్పుడు మారుతుందో తెలియనప్పుడు, నెట్వర్క్ పోలింగ్ |
| do-while | చివర్లో (Post-test) | కనీసం 1 సారి | మాన్యువల్గా మెయింటైన్ చేయాలి | మెనూ డ్రైవెన్ ప్రోగ్రామ్లు, పాస్వర్డ్ / పిన్ రీ-ట్రై లాజిక్ |
| foreach | MoveNext() కాల్ వద్ద |
0 సార్లు | సాధారణంగా లేదు (రీడ్-ఓన్లీ) | కలెక్షన్స్ (List, Dictionary, Array) ను సురక్షితంగా చదవడానికి |
10 🎯 ఆధునిక C# లో రేంజ్ (..) మరియు ఇండెక్స్ (^) తో లూపింగ్
C# 8+ లో వచ్చిన Index (^) మరియు Range (..) ఆపరేటర్లు లూప్స్ రాసేటప్పుడు కోడ్ను మరింత సంక్షిప్తం చేస్తాయి:
^1అంటే ఆఖరి నుండి మొదటి ఎలిమెంట్ (Last Element).1..^1అంటే మొదటి మరియు ఆఖరి ఎలిమెంట్లను వదిలేసి మధ్యలో ఉన్నవి మాత్రమే స్లైస్ చేయడం.
string[] auditLog = { "Header", "TXN_01", "TXN_02", "TXN_03", "Footer" };
// Header మరియు Footer వదిలేసి కేవలం ట్రాన్సాక్షన్స్ మాత్రమే ప్రాసెస్ చేయడం:
foreach (var record in auditLog[1..^1])
{
Console.WriteLine($"ప్రాసెస్ చేస్తున్న రికార్డు: {record}");
}
11 🚀 రియల్-వరల్డ్ ప్రాజెక్ట్: "SIP Wealth Compound Growth & Retirement Simulator"
లూప్స్ (for, while) మరియు కండిషన్స్ ఉపయోగించి — ఒక ఇన్వెస్టర్ ప్రతి నెలా చేసే సిస్టమాటిక్ ఇన్వెస్ట్మెంట్ ప్లాన్ (SIP) చక్రవడ్డీతో (Compound Interest) సంవత్సరాల తరబడి ఎలా వృద్ధి చెందుతుందో లెక్కించే ఒక పూర్తి స్థాయి ఫైనాన్షియల్ వెల్త్ సిమ్యులేటర్ ను నిర్మిద్దాం!
using System;
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine("=================================================");
Console.WriteLine("📈 మన ఇన్వెస్ట్మెంట్ - స్మార్ట్ SIP వెల్త్ కాలిక్యులేటర్");
Console.WriteLine("=================================================\n");
// పెట్టుబడి పారామీటర్లు
decimal monthlySip = 10000m; // ప్రతి నెలా ₹10,000
decimal annualReturnRate = 14.0m; // ఆశించే సగటు వార్షిక రాబడి 14%
int totalYears = 15; // 15 సంవత్సరాల పెట్టుబడి
decimal monthlyRate = (annualReturnRate / 100m) / 12m;
int totalMonths = totalYears * 12;
decimal totalInvested = 0m;
decimal currentPortfolioValue = 0m;
Console.WriteLine("సంవత్సరం | పెట్టిన పెట్టుబడి | పోర్ట్ఫోలియో సంపద (Compound Value)");
Console.WriteLine("-----------------------------------------------------------------");
// 1. నెలలవారీ చక్రవడ్డీ గణనకు 'for' లూప్
for (int month = 1; month <= totalMonths; month++)
{
totalInvested += monthlySip;
// ప్రస్తుత సంపదకు నెలవారీ SIP కలపడం + ఆ మొత్తంపై నెలవారీ చక్రవడ్డీ
currentPortfolioValue = (currentPortfolioValue + monthlySip) * (1m + monthlyRate);
// ప్రతి 12 నెలలకు (ఒక సంవత్సరానికి ఒకసారి) పురోగతి ప్రింట్ చేయడం
if (month % 12 == 0)
{
int year = month / 12;
Console.WriteLine($"సంవత్సరం {year,2} | ₹{totalInvested,15:N2} | ₹{currentPortfolioValue,22:N2}");
}
}
decimal totalGains = currentPortfolioValue - totalInvested;
decimal wealthMultiplier = currentPortfolioValue / totalInvested;
// 2. సంపద సారాంశం (Wealth Summary)
Console.WriteLine("-----------------------------------------------------------------");
Console.WriteLine($"మొత్తం పెట్టుబడి కాలం : {totalYears} సంవత్సరాలు ({totalMonths} నెలలు)");
Console.WriteLine($"జేబు నుండి పెట్టిన మొత్తం: ₹{totalInvested:N2}");
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine($"చక్రవడ్డీ ద్వారా వచ్చిన లాభం: ₹{totalGains:N2}");
Console.WriteLine($"చివరి పోర్ట్ఫోలియో విలువ : ₹{currentPortfolioValue:N2}");
Console.WriteLine($"సంపద పెరిగిన రెట్లు : {wealthMultiplier:F2}x రెట్లు!");
Console.ResetColor();
Console.WriteLine("=================================================");
Console.WriteLine("క్రమశిక్షణతో కూడిన దీర్ఘకాలిక పెట్టుబడి అపారమైన సంపదను ఇస్తుంది! 🚀\n");
నెలవారీ పెట్టుబడి మొత్తం (₹5,000, ₹25,000) మరియు సంవత్సరాలు మార్చి 15, 20 ఏళ్లలో చక్రవడ్డీ సంపద ఎలా రాకెట్లా ఎదుగుతుందో స్వయంగా లెక్కించండి!
12 🛑 బిగినర్స్ చేసే 7 ఘోరమైన లూప్ తప్పులు
లూప్స్ రాసేటప్పుడు అత్యధికంగా సంభవించే 7 ప్రమాదాలు:
అర్రేస్ 0 నుండి ప్రారంభమవుతాయి. for (int i = 0; i <= arr.Length; i++) అని రాస్తే ఆఖరి ఎలిమెంట్ వద్ద IndexOutOfRangeException ఖాయం. < మాత్రమే వాడాలి.
while (i < 10) లోపల i++ రాయడం మర్చిపోతే అది జీవితాంతం తిరిగే ఇన్ఫినిట్ లూప్ అయిపోయి మెమరీని నాశనం చేస్తుంది.
foreach (var x in list) { list.Remove(x); } రాస్తే తక్షణమే ఎక్సెప్షన్ వస్తుంది. కలెక్షన్ మార్చాలంటే రివర్స్ for లూప్ వాడాలి.
for (int i=0; i<5; i++); { ... } రాస్తే లూప్ ఖాళీగా 5 సార్లు తిరిగి ముగిసిపోతుంది, బ్రాకెట్లలోని కోడ్ కేవలం ఒక్కసారి మాత్రమే రన్ అవుతుంది!
str += item; లూప్లో వేల సార్లు రాస్తే ప్రతి రౌండ్కు కొత్త స్ట్రింగ్ మెమరీలో క్రియేట్ అవుతుంది. లూప్స్లో ఎల్లప్పుడూ StringBuilder వాడాలి.
for (double d = 0.0; d != 1.0; d += 0.1) రాస్తే ఖచ్చితంగా 1.0 అవ్వక ఇన్ఫినిట్ లూప్ అవుతుంది! కౌంటర్లకు ఎల్లప్పుడూ పూర్ణాంకాలే (int) వాడాలి.
do { ... } while (condition) చివర సెమీకోలన్ పెట్టకపోతే కంపైలర్ సింటాక్స్ ఎర్రర్ ఇస్తుంది.
13 🧠 ఇంటరాక్టివ్ సెల్ఫ్-అసెస్మెంట్ క్విజ్ (5 లోతైన ప్రాక్టికల్ ప్రశ్నలు & వివరణలు)
లూప్స్ పై మీ అవగాహనను ఈ 5 ప్రాక్టికల్ ప్రశ్నలతో పరీక్షించుకోండి:
❓ ప్రశ్న 1: while మరియు do-while మధ్య ఉన్న ప్రధాన సాంకేతిక వ్యత్యాసం ఏమిటి?
while అనేది Entry-controlled loop (ముందే కండిషన్ చెక్ చేస్తుంది, షరతు ఫాల్స్ అయితే 0 సార్లు రన్ అవుతుంది). do-while అనేది Exit-controlled loop (చివర్లో కండిషన్ చెక్ చేస్తుంది, కాబట్టి షరతు ఏమైనప్పటికీ కనీసం 1 సారి ఖచ్చితంగా రన్ అవుతుంది).
❓ ప్రశ్న 2: foreach లూప్ తిరుగుతున్నప్పుడు list.Remove(item) చేస్తే ఏ ఎక్సెప్షన్ వస్తుంది?
వివరణ: ఎన్యుమరేటర్ కలెక్షన్ వెర్షన్ నంబర్ను ట్రాక్ చేస్తుంది. లూప్ మధ్యలో ఎలిమెంట్స్ మారితే డేటా అస్థిరత ఏర్పడకుండా ఉండేందుకు రన్టైమ్ ఈ ఎక్సెప్షన్ను త్రో చేస్తుంది.
❓ ప్రశ్న 3: .NET JIT కంపైలర్ యొక్క "Bounds Check Elimination (BCE)" అంటే ఏమిటి?
for (int i = 0; i < arr.Length; i++) లో i ఎప్పటికీ అర్రే పరిమితి దాటదని కంపైలర్ నిరూపించగలదు. కాబట్టి ప్రతి రౌండ్లోనూ అర్రే బౌండరీస్ చెక్ చేసే అదనపు CPU ఇన్స్ట్రక్షన్లను రద్దు చేసి ఎగ్జిక్యూషన్ను వేగవంతం చేస్తుంది.
❓ ప్రశ్న 4: for (;;) సింటాక్స్ యొక్క అర్థం ఏమిటి?
true గా పరిగణిస్తుంది. while(true) కు ఇది సమానం.
❓ ప్రశ్న 5: లూప్ లోపల వేల సంఖ్యలో స్ట్రింగ్స్ కలుపుతున్నప్పుడు string += బదులు StringBuilder ఎందుకు వాడాలి?
string అనేది Immutable (మార్చలేనిది). += చేసిన ప్రతిసారీ మెమరీ హీప్లో సరికొత్త స్ట్రింగ్ ఆబ్జెక్ట్ ఏర్పడి గార్బేజ్ కలెక్టర్పై భారం పడుతుంది. StringBuilder అంతర్గత బఫర్ను మాత్రమే మార్చడం వల్ల మెమరీ ఆదా అవుతుంది మరియు వేగం వందల రెట్లు పెరుగుతుంది.