A C#-ban a null literál egy érték hiányát jelöli. A nullázható típus olyan típus, amely megengedi a null értékeket.
A C# 8.0 előtt a referenciatípusok mindig nullázhatók voltak, az értéktípusok viszont nem. Egy értéktípus úgy tehető nullázhatóvá, hogy kérdőjelet (?) fűzünk a neve után.
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
Ha egy null értékű változó tagjára hozzáférsz, az nem fordítási hibához vezet, hanem futásidőben NullReferenceException kivételt dob:
string sentence = null;
// Throws NullReferenceException at runtime
sentence.Length;
Hogy ezt a gyakori hibatípust kiküszöbölje, a C# 8 lehetővé teszi, hogy bekapcsolj egy funkciót, amely alapértelmezés szerint nem nullázhatóvá teszi a referenciatípusokat:
string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)
string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable
Ahhoz, hogy biztonságosan dolgozz nullázható értékekkel, használat előtt ellenőrizd, hogy null-e:
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"
A ?? operátorral akkor is visszaadhatsz egy alapértelmezett értéket, ha az érték null:
string? name1 = "John";
name1 ?? "Paul"; // => "John"
string? name2 = null;
name2 ?? "George"; // => "George"
A ?. operátorral biztonságosan hívhatsz meg tagokat egy esetleg null értéken:
string? fruit = "apple";
fruit?.Length; // => 5
string? vegetable = null;
vegetable?.Length; // => null
Ebben a feladatban olyan kódot írsz, amely névjelvényeket nyomtat gyári alkalmazottaknak.
Az alkalmazottaknak van azonosítójuk, nevük és részlegnevük. Az alkalmazottak jelvénycímkéi a következő formátumot követik: "[id] - name - DEPARTMENT". Valósítsd meg a (statikus) Badge.Print() metódust, amely egy alkalmazott jelvénycímkéjét adja vissza:
Badge.Print(734, "Ernest Johnny Payne", "Strategic Communication");
// => "[734] - Ernest Johnny Payne - STRATEGIC COMMUNICATION"
Figyelj arra, hogy a címkén a részleg neve csupa nagybetűvel szerepel.
A számítógépes rendszer sajátossága miatt előfordul, hogy az új alkalmazottaknak még nincs azonosítójuk, amikor elkezdenek dolgozni a gyárban. Mivel a jelvény kötelező, ideiglenes jelvényt kapnak, amelyen nincs ott az azonosító előtagja. Módosítsd a (statikus) Badge.Print() metódust, hogy azoknak az új alkalmazottaknak is működjön, akiknek még nincs azonosítójuk:
Badge.Print(id: null, "Jane Johnson", "Procurement");
// => "Jane Johnson - PROCUREMENT"
A gyár tulajdonosának is folyamatosan jelvényt kell viselnie. A tulajdonosnak azonban nincs részlege. Ebben az esetben a címkére a részleg neve helyett az "OWNER" kerüljön. Módosítsd a (statikus) Badge.Print() metódust, hogy a tulajdonos számára is nyomtasson címkét:
Badge.Print(254, "Charlotte Hale", department: null);
// => "[254] - Charlotte Hale - OWNER"
Figyelj arra, hogy előfordulhat, hogy a tulajdonos egyben új alkalmazott is:
Badge.Print(id: null, "Charlotte Hale", department: null);
// => "Charlotte Hale - OWNER"
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) C# nyelvet 62 fogalom178 feladat segítségével, valódi emberi mentorálással, mindez ingyen.