I C# 8 introducerades Nullable reference types.
Som default (om man inte använder sig av nullable reference types) kan en referenstyp ha ett nullvärde:
Person p = GetPersonIfExists(personId);
Om man istället använder sig av nullable reference types måste en referenstyp ha ? för att tala om att den kan ha ett nullvärde:
Person? p = GetPersonIfExists(personId);
I exemplet ovan blir det tydligare att p faktiskt kan ha null som värde efter att GetPersonIfExists anropats. I det föregående exemplet där vi inte använder en nullable referenstyp vet man inte säkert om p kan vara null, eller om det kommer innehålla ett objekt med defaultvärden eller nåt annat.
Men samtidigt som nullable reference types kan göra koden tydligare och säkrare så tycker jag det också kan komplicera koden ytterligare när man har det enablat. Till exempel kan man ibland behöva använda attribut för att hjälpa null-state analysis att förstå koden (och därmed bli av med varningar den ger). Skrev ett enkelt exempel här:
Vad tycker ni om nullable reference types?
Har ni det enablat i era egna projekt?
Använder ni det på jobbet eller har ni disablat det helt och hållet?
Som default (om man inte använder sig av nullable reference types) kan en referenstyp ha ett nullvärde:
Person p = GetPersonIfExists(personId);
Om man istället använder sig av nullable reference types måste en referenstyp ha ? för att tala om att den kan ha ett nullvärde:
Person? p = GetPersonIfExists(personId);
I exemplet ovan blir det tydligare att p faktiskt kan ha null som värde efter att GetPersonIfExists anropats. I det föregående exemplet där vi inte använder en nullable referenstyp vet man inte säkert om p kan vara null, eller om det kommer innehålla ett objekt med defaultvärden eller nåt annat.
Men samtidigt som nullable reference types kan göra koden tydligare och säkrare så tycker jag det också kan komplicera koden ytterligare när man har det enablat. Till exempel kan man ibland behöva använda attribut för att hjälpa null-state analysis att förstå koden (och därmed bli av med varningar den ger). Skrev ett enkelt exempel här:
Kod:
var strings = new string?[] {"abc", null, "abcdef"}; var rnd = new Random(); // Om vi inte använder [AllowNull] får vi denna varning: // warning CS8604: Possible null reference argument for parameter 'input' in 'bool Program.GetString(string input) bool moreThan3Characters = HasGoodStringLength(strings[rnd.Next(3)]); ... public static bool HasGoodStringLength([AllowNull] string input) { if (input is null) { return false; } return input.Length > 3; }
Vad tycker ni om nullable reference types?
Har ni det enablat i era egna projekt?
Använder ni det på jobbet eller har ni disablat det helt och hållet?