Ternary & Conditional Expressions στην C#

Published: (February 18, 2026 at 02:38 PM EST)
5 min read
Source: Dev.to

Source: Dev.to

1. Conditional (Ternary) Operator ?:

Σύνταξη

condition ? expressionIfTrue : expressionIfFalse;

Παράδειγμα

var status = isActive ? "Enabled" : "Disabled";

Ισοδύναμο με

string status;
if (isActive)
    status = "Enabled";
else
    status = "Disabled";

Πότε να το χρησιμοποιούμε

  • ✔ Όταν έχουμε δύο απλές επιλογές
  • ✔ Όταν το αποτέλεσμα είναι απλό expression
  • ✔ Όταν βελτιώνει την αναγνωσιμότητα

Πότε να το αποφεύουμε

  • ❌ Όταν οι εκφράσεις είναι μεγάλες
  • ❌ Όταν περιέχουν business logic
  • ❌ Όταν δυσκολεύει το debugging

📚 Microsoft Documentation

Conditional operator (?:)

2. Nested Ternary

var grade =
    score >= 90 ? "A" :
    score >= 80 ? "B" :
    score >= 70 ? "C" :
    "Fail";

Ανάλυση

Επιτρέπει πολλαπλές συνθήκες σε μία έκφραση, αλλά μειώνει δραματικά την αναγνωσιμότητα.

Recommendation

Προτιμήστε switch expression αντί για nested ternary.

3. Null‑Conditional Operator ?.

Αποφεύγει NullReferenceException.

var name = user?.Name;

Σημαίνει: αν το user δεν είναι null, πάρε το Name, αλλιώς δώσε null.

Ισοδύναμο με

var name = user != null ? user.Name : null;

Πότε να το χρησιμοποιούμε

  • ✔ Όταν διαβάζουμε nested properties
  • ✔ Όταν θέλουμε null‑safe access

📚 Microsoft Documentation

Member access operators (?., ?[])

4. Null‑Coalescing Operator ??

var name = input ?? "Default";

Αν το input είναι null → επιστρέφει "Default".

Ισοδύναμο με

var name = input != null ? input : "Default";

ή

string name;
if (input == null)
    name = "Default";
else
    name = input;

📚 Microsoft Documentation

Null‑coalescing operator (??)

5. Null‑Coalescing Assignment ??=

user.Name ??= "Guest";

Αναθέτει τιμή μόνο αν η μεταβλητή είναι null.

  • a ?? b → δίνει a αν δεν είναι null, αλλιώς b
  • a ??= b → αναθέτει στο a το b μόνο αν το a είναι null

Ισοδύναμο με

if (user.Name == null)
{
    user.Name = "Guest";
}

Χρήσιμο για

  • Lazy initialization
  • Defaults
  • DTO normalization

6. Throw Expressions (C# 7+)

Μπορούμε να χρησιμοποιήσουμε throw μέσα σε expression.

var user = dto.User
    ?? throw new ArgumentNullException(nameof(dto.User));

ή

var result = isValid
    ? value
    : throw new InvalidOperationException();

Ιδανικό για guard clauses σε constructors ή handlers.

📚 Microsoft Documentation

Throw expressions

7. Pattern Matching με Ternary

var name = obj is User u ? u.Name : "Unknown";

Ισοδύναμο με

User u;
if (obj is User)
{
    u = (User)obj;   // cast
    name = u.Name;
}
else
{
    name = "Unknown";
}

ή

if (obj is User u)
    return u.Name;

return "Unknown";

Συνδυάζει type check + assignment.

  • ✔ Πολύ χρήσιμο σε handlers και mapping logic.

📚 Microsoft Documentation

Pattern matching

8. Switch Expressions (Modern Replacement)

var role = userType switch
{
    "Admin" => 10,
    "User"  => 5,
    _       => 0
};

Εξήγηση:

  • Αν userType είναι "Admin"role = 10
  • Αν είναι "User"role = 5
  • Για οποιαδήποτε άλλη τιμή (_) → role = 0

Πλεονεκτήματα

  • ✔ Πιο readable από nested ternary
  • ✔ Καλύτερο για multiple conditions
  • ✔ Υποστηρίζει pattern matching

📚 Microsoft Documentation

Switch expressions

9 Advanced Pattern Matching (Property Patterns)

var message = user switch
{
    null => "No user",
    { IsActive: false } => "Inactive user",
    { Role: "Admin" } => "Welcome admin",
    _ => "Welcome"
};

Είναι ένα switch expression πάνω στο user που διαλέγει μήνυμα ανάλογα με την κατάσταση του:

  • Αν user == null"No user"
  • Αλλιώς αν IsActive == false"Inactive user"
  • Αλλιώς αν Role == "Admin""Welcome admin"
  • Αλλιώς → "Welcome"

Ιδανικό για business‑rules classification.

Πότε να χρησιμοποιούμε Conditional Expressions

  • Θέλουμε σύντομο, καθαρό assignment
  • Έχουμε απλή δυαδική επιλογή
  • Θέλουμε να μειώσουμε boiler‑plate code
  • Βελτιώνουμε την αναγνωσιμότητα

Πότε να τα αποφεύσουμε

  • Η λογική περιέχει πολλαπλά business rules
  • Χρειάζεται debugging με breakpoints
  • Δημιουργούνται nested ternary
  • Μειώνεται η αναγνωσιμότητα

Best Practice Guideline

  • 1 condition → ternary
  • Multiple discrete values → switch expression
  • Null fallback??
  • Guard clause?? throw
  • Complex logic → if/else block

Να θυμάσαι…

Οι conditional expressions στην C# αποτελούν ισχυρό εργαλείο για τη δημιουργία εκφραστικού και συνοπτικού κώδικα.

  • Η σωστή χρήση τους βελτιώνει την αναγνωσιμότητα και μειώνει τον όγκο του κώδικα.
  • Η υπερβολική χρήση τους οδηγεί σε “clever code” αντί για “clear code”.

Αρχή: Write code for humans first, compilers second.

  • Όταν το ternary κάνει τον κώδικα πιο καθαρό — χρησιμοποίησέ το.
  • Όταν τον κάνει πιο έξυπνο αλλά λιγότερο κατανοητό — απόφυγε το.
0 views
Back to Blog

Related posts

Read more »

OpenClaw Is Unsafe By Design

OpenClaw Is Unsafe By Design The Cline Supply‑Chain Attack Feb 17 A popular VS Code extension, Cline, was compromised. The attack chain illustrates several AI‑...