c_sharp — συγκεντρωτικός οδηγός — DedSec Project
c_sharp — συγκεντρωτικός οδηγός C Ένα μικρό πρόγραμμα χωρίς exceptions ως control flow Σε .NET console application εξέτασε την είσοδο χρήστη ως δεδομένα που μπορεί να μην έχουν την…
C#
Ένα μικρό πρόγραμμα χωρίς exceptions ως control flow
Σε .NET console application εξέτασε την είσοδο χρήστη ως δεδομένα που μπορεί να μην έχουν την αναμενόμενη μορφή. Με int.TryParse παίρνεις ταυτόχρονα ένδειξη εγκυρότητας και αποτέλεσμα, χωρίς να πρέπει να βασιστείς σε FormatException για συνηθισμένη μη έγκυρη είσοδο.
using System;
using System.Globalization;
static bool ParsePort(string raw, out int port)
{
if (!int.TryParse(raw, NumberStyles.None,
CultureInfo.InvariantCulture, out port))
return false;
return port is >= 1 and <= 65535;
}
foreach (var text in new[] { "8080", "0", "65536", "abc" })
{
Console.WriteLine($"{text}: {ParsePort(text, out int port)}");
}
Η πολιτική 1..65535 ανήκει εδώ στην εφαρμογή. Δεν σημαίνει πως κάθε port θα μπορεί να γίνει bind από τον χρήστη: δικαιώματα, συγκρούσεις, firewall και κατάσταση λειτουργικού συστήματος είναι χωριστά θέματα. Το NumberStyles.None αποτρέπει παραλλαγές όπως κενά και πρόσημα, οπότε τεκμηρίωσε αυτή την επιλογή ως συμβόλαιο εισόδου.
Ασφαλές resource lifetime
Το using statement ή το using declaration καλεί Dispose σε IDisposable στο κατάλληλο τέλος scope, ακόμη και αν προκύψει exception. Αυτό δεν ισοδυναμεί με την εξασφάλιση ότι κάθε resource υλοποιεί IDisposable ή ότι μπορεί να επαναχρησιμοποιηθεί μετά το Dispose. Γράψε μικρό πείραμα με FileStream σε προσωρινό αρχείο και προσπάθησε να διαβάσεις μετά το κλείσιμο· χρησιμοποίησε προσωρινό φάκελο, ποτέ αυθαίρετο path χρηστών.
Ασφαλής ασύγχρονη εκτέλεση
Διάκρινε Task-returning async method από async void, το οποίο κανονικά περιορίζεται σε event handlers. Για λειτουργίες I/O, εξήγησε γιατί πρέπει να υπάρχει await στο κατάλληλο scope αντί να μπλοκάρεις με .Result. Παρατήρησε τι γίνεται σε exception και πώς παραδίδεται στον caller.
Κριτήρια αποδοχής
Συγκέντρωσε outputs για 8080, 0, 65536, "abc" και κενό string. Τρέξε το ίδιο console project με γνωστή έκδοση .NET SDK και σημείωσε τα compile/runtime diagnostics. Ολοκλήρωσε μία αποτυχία με ανοιχτό resource και την ασφαλή διόρθωσή της. Τα snippets προορίζονται για δοκιμή και δεν χαρακτηρίζονται ήδη εκτελεσμένα.
C_Sharp — Αναλυτικός οδηγός εξάσκησης
Μικρή εφαρμογή χωρίς εξωτερική βάση
Δημιούργησε δοκιμαστικό έργο με dotnet new console και βάλε στο Program.cs συγκεκριμένες εγγραφές:
using System;
using System.Linq;
var people = new[] {
new { Name = "Ada", Points = 5 },
new { Name = "Lin", Points = 2 },
new { Name = "Ava", Points = 5 }
};
var winners = people.Where(p => p.Points >= 5)
.OrderBy(p => p.Name)
.Select(p => p.Name);
Console.WriteLine(string.Join(",", winners));
Προβλέπεται η γραμμή Ada,Ava. Η Where φιλτράρει, η OrderBy ορίζει προβλέψιμη σειρά και η Select κρατά μόνο τα ονόματα. Πολλά LINQ queries αξιολογούνται με αναβολή: ο ορισμός τους δεν σημαίνει ότι έχουν ήδη αποθηκεύσει στιγμιότυπο. Οι εντολές είναι άσκηση, όχι επιβεβαιωμένη εκτέλεση σε .NET στο παρόν περιβάλλον.
Πότε υπολογίζεται το αποτέλεσμα;
Φτιάξε query πάνω σε μεταβλητή συλλογή, άλλαξε τη συλλογή και έπειτα απαρίθμησε το αποτέλεσμα. Σύγκρινε με μια δεύτερη εκδοχή όπου καλείς ToArray() πριν από την αλλαγή. Κατάγραψε πότε παρατηρείται η μεταβολή. Το ζητούμενο δεν είναι γενική σύγκριση ταχύτητας, αλλά η σημασία του χρόνου αξιολόγησης.
Εισερχόμενο null και λάθος αριθμός
Πρόσθεσε πεδίο string? και δοκίμασε int.TryParse με ρητό έλεγχο του boolean αποτελέσματος. Έλεγξε "12", "bad", null και κενό κείμενο. Μη χρησιμοποιείς int.Parse χωρίς χειρισμό εξαίρεσης και μην καταχράσαι το null-forgiving !: δεν μετατρέπει μη έγκυρα δεδομένα σε σωστά. Η αδυναμία ανάλυσης δεν πρέπει να συγχέεται με κανονική βαθμολογία μηδέν.
Αυτοτελής επέκταση
Ομαδοποίησε με GroupBy ως προς Points και ταξινόμησε αλφαβητικά τα ονόματα κάθε ομάδας. Δοκίμασε ισοβαθμίες, κενή συλλογή και όνομα με επιπλέον κενά. Σύγκρινε την ακριβή σειρά και όχι μόνο το πλήθος. Τρέξε δοκιμές σε τοπικό έργο χωρίς πραγματικά προσωπικά δεδομένα. Αναφορές: https://learn.microsoft.com/dotnet/csharp/ και https://learn.microsoft.com/dotnet/csharp/linq/
C_Sharp — Παραδείγματα πραγματικού κώδικα
Εκτέλεση των παραδειγμάτων
Τα παραδείγματα είναι μικρά και αυτοτελή. Χρησιμοποίησε τη σχετική εγκατεστημένη γλώσσα. Ενδεικτικά: dotnet run. Μη συγχέεις τα ονόματα αρχείων με αυτόματη εγκατάσταση. Δούλεψε σε δοκιμαστικό φάκελο.
C_Sharp — Διαδρομή ουσιαστικής εξάσκησης
Στάδιο 1: κατανόηση εκτέλεσης
Φτιάξε console project με nullable reference types. Κάνε parsing CLI port μέσω int.TryParse και έλεγξε 1..65535. Διαχώρισε άκυρο string από έγκυρο zero που απορρίπτεται από business rule.
Στάδιο 2: απόδειξη με ελεγχόμενες δοκιμές
Σχεδίασε record configuration και result τύπου success/error. Δοκίμασε κενό, null, 65535, 65536 και αρχικά spaces. Τα nullability annotations δεν επικυρώνουν αυτόματα JSON.
Στάδιο 3: μικρό ολοκληρωμένο έργο
Διάβασε local file με async Task και σύγκρινε await με blocking Task.Result. Πρόσθεσε CancellationToken και επαλήθευσε ότι σε cancellation δεν πειράζονται δεδομένα. Δήλωσε συγκεκριμένο .NET SDK.
C Sharp — Τεχνικά σημεία και συχνές παγίδες
Τεχνική γνώση
- Οι επισημάνσεις nullable references βοηθούν τον στατικό έλεγχο με κατάλληλες ρυθμίσεις έργου.
- Το async/await περιγράφει ασύγχρονη εργασία· ένα Task δεν σημαίνει υποχρεωτικά νέο νήμα.
- Το using και await using μπορούν να εξασφαλίσουν αποδέσμευση πόρων.