C#: atestat și pregătire ONTI

C#: depanare cu breakpoint și starea programului

Urmărește o eroare de calcul în C# folosind breakpoint, Watch și Step Over. Compară starea intermediară cu rezultatul așteptat și construiește un test util.

Depanarea începe cu o diferență precisă: ce rezultat aștepți și ce rezultat obții. O aplicație poate compila și totuși să calculeze greșit. Vom calcula media notelor 4, 7 și 10. Rezultatul corect este 7, iar suma intermediară este 21. Păstrăm aceste valori scrise înainte să pornim depanatorul, pentru a nu decide după rezultat ce ar fi trebuit să se întâmple.

Cum lucrezi cu exemplul

Programul complet folosește C# 7.3 și API-uri disponibile în .NET Framework 4.8. Deschide Lesson.csproj din arhivă sau creează un proiect Console App (.NET Framework 4.8) și înlocuiește Program.cs. Datele de demonstrație sunt incluse în cod.

Descarcă sursele și instrucțiunile.

Ideea și pașii de implementare

Pune un breakpoint pe linia care adaugă nota în sumă. În Watch urmărește i, grades[i] și sum. Step Over execută instrucțiunea curentă, iar Step Into intră într-o metodă apelată. Nu confunda valoarea înaintea liniei marcate cu valoarea de după executarea ei. Pentru prima iterație, sum este zero înainte și patru după adunare.

Ipoteza de verificat este că suma conține exact elementele deja parcurse. După i elemente prelucrate, această proprietate trebuie să rămână adevărată. Dacă resetezi sum în interiorul buclei, proprietatea cade la a doua iterație. Depanatorul arată locul în care apare prima divergență, nu doar rezultatul greșit de la final.

Exemplu și rezultat așteptat

Programul corect afișează pe linii separate 4, 11 și 21, apoi 7.0. Împărțirea folosește double pentru ca o altă listă, precum 4 și 7, să producă 5.5. Lista goală este respinsă explicit înainte de împărțire. Exemplul folosește date fixe pentru ca două rulări să poată fi comparate fără introducere manuală.

Schemă pentru lecția 3: sum = 0; + 4 → 4; + 7 → 11; + 10 → 21; media 7.sum = 0 → + 4 → 4 → + 7 → 11 → + 10 → 21; media 7.Mărește schema ↗

Codul complet

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Globalization;
using System.Xml.Linq;
using System.Data;
class Program {
    static void Main() {
        int[] grades = { 4, 7, 10 };
        if (grades.Length == 0) throw new InvalidOperationException("Fara note");
        int sum = 0;
        for (int i = 0; i < grades.Length; i++) {
            sum += grades[i]; Console.WriteLine(sum);
        }
        double average = (double)sum / grades.Length;
        Console.WriteLine(average.ToString("F1", CultureInfo.InvariantCulture));
    }
}

Rezultatul programului:

4
11
21
7.0

Greșeli și limite

Nu repara problema prin schimbarea rezultatului afișat sau prin ascunderea excepției. Nu modifica simultan bucla, formula și datele: pierzi explicația cauzei. Folosește Output sau o urmă temporară când depanatorul nu este disponibil, dar elimină mesajele tehnice din interfața finală. O urmă foarte lungă poate ascunde tocmai prima instrucțiune greșită.

Exersează

Mută intenționat inițializarea sumei în buclă și prezice ultima valoare înainte să rulezi. Vei obține 10 în loc de 21. Revino la codul corect și înlocuiește datele cu 4 și 7; media trebuie să fie 5.5. Adaugă un test pentru tabloul gol și explică de ce un breakpoint pe afișarea finală este mai puțin informativ decât unul în buclă.

Continuă parcursul

Parcursul complet de 50 de lecții

Bazele C#

Lecția precedentă: C#: transformă cerințele în teste de acceptare

Lecția următoare: C#: modelează un împrumut cu reguli și identitate.

Referință: documentația Microsoft.

Întrebări frecvente

Un breakpoint schimbă rezultatul?

În mod obișnuit oprește execuția pentru inspecție. În aplicații cu timp sau concurență, oprirea poate influența comportamentul temporal.

Ce inspectez prima dată?

Intrările și prima stare intermediară care diferă de calculul făcut pe hârtie.

De ce păstrez testul după reparare?

Pentru a detecta dacă aceeași eroare reapare la o modificare ulterioară.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →