Dajbych.net


Jak odkazové typy C# s možnou hodnotou null ovlivňují vaše ASP.NET Core Routing

, 1 minuta čtení

net2015 logo

Myslel jsem si, že nová funkce C# 8.0 – non-nullable reference types – je pouze funkcí IntelliSense využívající technologii Roslyn, která zabraňuje výjimkám nulových odkazů. Mýlil jsem se. Může to v mnoha ohledech ovlivnit fungování vaší aplikace. Přesněji řečeno, vše, co využívá reflexi, se může začít chovat jinak. To zahrnuje ASP.NET Core routing. Některé vazby mohou přestat fungovat, pokud nejsou použity žádné další změny kódu.

Podívejme se na to na příkladu. Rozlišování mezi odkazovými typy s možnou hodnotou null a odkazy, které neumožňují hodnotu null, lze zapnout v souboru .csproj:

<PropertyGroup>
  <Nullable>enable</Nullable>
</PropertyGroup>

Nemyslete si, že se to nevztahuje ani na hodnotu annotations:

<PropertyGroup>
  <Nullable>annotations</Nullable>
</PropertyGroup>

Trasa může vypadat například takto:

[HttpPost]
public async Task MyMethod([Required, FromBody] MyContract contract) {
  ...
}

public class MyContract {
  public string MyValue { get; set; }
  ...
}

MyValue nemá atribut Required, takže i v případě, že požadavek JSON nemá vlastnost myValue, bude fungovat vazba mezi požadavkem HTTP a MyMethod. To platí, pokud nepovolíte typy odkazů s možnou hodnotou null. Jakmile to uděláte, musíte deklarovat, že MyValue může mít hodnotu null, protože se jedná o výchozí hodnotu, pokud vlastnost není zahrnuta v požadavku. Pokud typ nemůže mít hodnotu null, nelze použít výchozí hodnotu a vlastnost je vyžadována automaticky syntaxí. Atribut Required by byl v tomto případě nadbytečný. Stane se také nadbytečným v deklaraci parametru contract.

public class MyContract {
  public string? MyValue { get; set; }
  ...
}

MyContract výše má MyValue typu string?, což znamená, že vlastnost je volitelná. Kontrakt bude i nadále fungovat jako dříve, kdy byly povoleny odkazové typy s možnou hodnotou null.