Vinnaren i pepparkakshustävlingen!
2024-10-29, 10:14
  #1
Medlem
A-Good-Mans avatar
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:

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?
Citera
2024-10-29, 10:51
  #2
Medlem
kalkryggars avatar
Visst, en bra sak som kanske skulle infogats på ett enklare sätt. Vet att många företag hoppade ur det snabbt.

Däremot så tyckte jag att det fungerade på ett litet lustigt sätt för att identifiera de som var lite svagare i sin tanke.

Just då satt jag något med C# och såg hur vissa accepterade det och jobbade med det. Medans andra satt i veckor med det och sen ändå kom och frågade hur man ska tänka. Sen kunde det gå ytterligare lite tid så kom de med ett nytt exempel där det hade kört ihop sig. Då fick någon förklara för dem och då trillade polletten ner. Men bara för just det exemplet för sen var de tillbaka med ett nytt scenario som de inte förstod.
Citera
2024-10-29, 13:12
  #3
Medlem
elin1488s avatar
Ibland blir det väl lite plottrigt läsbarhetsmässigt med en massa ?, men en massa null checkar för att man ska göra abc().def().ghi() är skönt att slippa
Citera
2024-10-29, 13:19
  #4
Medlem
A-Good-Mans avatar
Citat:
Ursprungligen postat av kalkryggar
Visst, en bra sak som kanske skulle infogats på ett enklare sätt. Vet att många företag hoppade ur det snabbt.

Däremot så tyckte jag att det fungerade på ett litet lustigt sätt för att identifiera de som var lite svagare i sin tanke.

Just då satt jag något med C# och såg hur vissa accepterade det och jobbade med det. Medans andra satt i veckor med det och sen ändå kom och frågade hur man ska tänka. Sen kunde det gå ytterligare lite tid så kom de med ett nytt exempel där det hade kört ihop sig. Då fick någon förklara för dem och då trillade polletten ner. Men bara för just det exemplet för sen var de tillbaka med ett nytt scenario som de inte förstod.
Den största utmaningen med NRT är nog att få det att fungera i ett befintligt projekt. Ändrar man koden på ett ställe blir det en varning på ett annat ställe och så fortsätter det. Kan bli massa kod man får hålla på ändra.

Om man skapar nya projekt däremot och redan då vet att man ska använda NRT så blir det lite enklare.
Citera
2024-10-29, 13:28
  #5
Medlem
A-Good-Mans avatar
Citat:
Ursprungligen postat av elin1488
Ibland blir det väl lite plottrigt läsbarhetsmässigt med en massa ?, men en massa null checkar för att man ska göra abc().def().ghi() är skönt att slippa
Null Conditional operator är något jag verkligen gillar Så skönt slippa massa null checks som du skriver.
Citera
2024-10-29, 13:46
  #6
Medlem
A-Good-Mans avatar
Tänkte ge ett exempel på kod som jag tycker är lite konstig. Om man har en klass som nedan med en property som inte är nullable så är ett sätt att lösa det på att ge propertyn ett default värde. Det lite roliga är att man kan sätta null som default värde om man samtidigt använder null-forgiving-operatorn.

Kod:
    public class Person
    {

        // warning CS8618: Non-nullable property 'Name' must contain a non-null value when exiting constructor.
        //public string Name { get; init; };

        // Ingen varning
        public string Name { get; init; } = null!;
    }
Citera
2024-10-29, 15:01
  #7
Medlem
nginxs avatar
Douglas Crockford (skaparen av JSON) kallar detta för en "WTF?"-operator. Och han jobbar på att ta fram något nytt i sitt programspråk kallat Misty. https://youtu.be/dAXUAg7H0fA?t=450

Galet att C# inte fick det förrän vid 8.0 dock...
__________________
Senast redigerad av nginx 2024-10-29 kl. 15:09.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in