Ternary & Conditional Expressions στην C#
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
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
5. Null‑Coalescing Assignment ??=
user.Name ??= "Guest";
Αναθέτει τιμή μόνο αν η μεταβλητή είναι null.
a ?? b→ δίνειaαν δεν είναιnull, αλλιώςba ??= 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
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
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
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 κάνει τον κώδικα πιο καθαρό — χρησιμοποίησέ το.
- Όταν τον κάνει πιο έξυπνο αλλά λιγότερο κατανοητό — απόφυγε το.