Στη C#, το literal null χρησιμοποιείται για να δηλώσει την απουσία μιας τιμής. Ένας nullable τύπος είναι ένας τύπος που επιτρέπει τιμές null.
Πριν από τη C# 8.0, οι τύποι αναφοράς ήταν πάντα nullable, ενώ οι τύποι τιμής όχι. Ένας τύπος τιμής μπορεί να γίνει nullable αν του προσθέσεις ένα ερωτηματικό (?).
string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable
int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable
int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable
Η πρόσβαση στο μέλος μιας μεταβλητής που είναι null δεν προκαλεί σφάλμα μεταγλώττισης, αλλά έχει ως αποτέλεσμα να πεταχτεί μια NullReferenceException κατά την εκτέλεση:
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
Για να αντιμετωπίσεις αυτό το συνηθισμένο είδος λάθους, η C# 8 επιτρέπει να ενεργοποιήσεις μια δυνατότητα που κάνει τους τύπους αναφοράς μη nullable από προεπιλογή:
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
Για να δουλέψεις με ασφάλεια με τιμές nullable, έλεγξε αν είναι null πριν τις χρησιμοποιήσεις:
string NormalizedName(string? name)
{
if (name == null)
{
return "UNKNOWN";
}
// Value is not null at this point, so no compile warning
// and no runtime NullReferenceException being thrown
return name.ToUpper();
}
NormalizedName(null); // => "UNKNOWN"
NormalizedName("Elisabeth"); // => "ELISABETH"
Ο τελεστής ?? επιτρέπει να επιστρέψεις μια προεπιλεγμένη τιμή όταν η τιμή είναι null:
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
Ο τελεστής ?. επιτρέπει να καλέσεις μέλη με ασφάλεια σε μια τιμή που μπορεί να είναι null:
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
Σε αυτή την άσκηση θα γράψεις κώδικα για να εκτυπώνεις κονκάρδες ονόματος για υπαλλήλους εργοστασίου.
Οι υπάλληλοι έχουν ένα αναγνωριστικό, ένα όνομα και ένα όνομα τμήματος. Οι ετικέτες των κονκαρδών των υπαλλήλων έχουν την εξής μορφή: "[id] - name - DEPARTMENT". Υλοποίησε τη (static) μέθοδο Badge.Print() ώστε να επιστρέφει την ετικέτα της κονκάρδας ενός υπαλλήλου:
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
Σημείωσε ότι το τμήμα πρέπει να γράφεται με κεφαλαία γράμματα στην ετικέτα.
Λόγω μιας ιδιομορφίας του υπολογιστικού συστήματος, οι νέοι υπάλληλοι μερικές φορές δεν έχουν ακόμη αναγνωριστικό όταν ξεκινούν να εργάζονται στο εργοστάσιο. Καθώς οι κονκάρδες είναι υποχρεωτικές, θα λαμβάνουν μια προσωρινή κονκάρδα χωρίς το πρόθεμα του αναγνωριστικού. Τροποποίησε τη (static) μέθοδο Badge.Print() ώστε να υποστηρίζει νέους υπαλλήλους που δεν έχουν ακόμη αναγνωριστικό:
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
Ακόμη και ο ιδιοκτήτης του εργοστασίου πρέπει να φοράει κονκάρδα ανά πάσα στιγμή. Ωστόσο, ο ιδιοκτήτης δεν έχει τμήμα. Σε αυτή την περίπτωση, η ετικέτα πρέπει να εμφανίζει "OWNER" αντί για το όνομα του τμήματος. Τροποποίησε τη (static) μέθοδο Badge.Print() ώστε να εμφανίζει μια ετικέτα για τον ιδιοκτήτη:
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
Σημείωσε ότι είναι πιθανό ο ιδιοκτήτης να είναι και νέος υπάλληλος:
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.