Implicit Usings Met DotNet 6.0

Deze blogpost is een onderdeel van blogs over de nieuwe features van .Net 6 en C# 10. Om gebruik te maken van deze features moet je de dotnet 6.0 SDK installeren. Deze dotnet 6.0 SDK is hier te vinden.

Implicit Usings genereert automatische Global Using. Het type Global Using is afhankelijk van de gebruikte SDK en dus afhankelijk van het project type. Tijdens het bouwen van het project wordt er vervolgens een sourcefile gegenereerd welke de global usings bevat. 

 

Gebruikte Setup

  • Visual studio 2022
  • .net 6.0.100

Auteur:

Jeroen de Knegt

Lead Cloud Software Engineering

Zoals in de introductie al vermeld, is deze feature afhankelijk van het project type. In je project file geef je aan of je gebruik wilt maken van Implicit Usings. standaard wordt deze bij een nieuw project aangemaakt, mocht je deze feature in een bestaand project willen gebruiken kan je deze handmatig toevoegen door onder de property group “<ImplicitUsings>enable</ImplicitUsings>” te plaatsen. 

.csprj

<Project Sdk=“Microsoft.NET.Sdk”>

<PropertyGroup>

<OutputType>Exe</OutputType>

<TargetFramework>net6.0</TargetFramework>

<ImplicitUsings>enable</ImplicitUsings>

<Nullable>enable</Nullable>

</PropertyGroup>

</Project>

Wanneer deze feature aanstaat zal tijdens het bouwen van je project een extra source file gemaakt worden waarin afhankelijk van je project type een aantal Global Usings staan. 

  

Deze gegenereerde sourcefile kan je vinden in de folder onder obj => debug => net6.0 => ref. 

En bevat de naam van het project gevolgd door .GlobalUsings.g.cs. 

Voor een Console applicatie, die gebruikt maken van de Microsoft.NET.Sdk, ziet dit er als volgt uit: 

// <auto-generated/> 

global using global::System; 

global using global::System.Collections.Generic; 

global using global::System.IO; 

global using global::System.Linq; 

global using global::System.Net.Http; 

global using global::System.Threading; 

global using global::System.Threading.Tasks; 

Wat opvalt is de Global Namespace alias qualifier (geïntroduceerd in C# 2.0). Dit helpt je bij het voorkomen van problemen met de naam. Meer hierover zie msdn: pagina :: operator – C# reference | Microsoft Docs 

  

Voor projecten, die gebruik maken van een Microsoft.Net.Sdk.Web, ziet dit er als volgt uit. 

Implicit usings web

// <auto-generated/>

global using global::Microsoft.AspNetCore.Builder;

global using global::Microsoft.AspNetCore.Hosting;

global using global::Microsoft.AspNetCore.Http;

global using global::Microsoft.AspNetCore.Routing;

global using global::Microsoft.Extensions.Configuration;

global using global::Microsoft.Extensions.DependencyInjection;

global using global::Microsoft.Extensions.Hosting;

global using global::Microsoft.Extensions.Logging;

global using global::Newtonsoft.Json;

global using global::System;

global using global::System.Collections.Generic;

global using global::System.IO;

global using global::System.Linq;

global using global::System.Net.Http;

global using global::System.Threading;

global using global::System.Threading.Tasks;

Zoals je ziet wordt er een groot aantal Global Usings gedefinieerd. Soms geven global usings problemen. Bijvoorbeeld de system.net.http.json omdat je reeds gebruik maakt van newtonsoft.json. Dan kun je het project ook zo configureren dat deze Global Using niet automatisch gegenereerd wordt.  

Dit doe je door je “.csproj“ file aan te passen door het volgende XML Element <Using Remove=“{namespace}” /> toe te voegen binnen een <ItemGroup>XML element. 

 

Tevens is het mogelijk om ook een nieuwe namespace toe te voegen. Hiervoer voeg je het XML Element <Using Include=“{namespace}” /> toe binnen een <ItemGroup>XML element. 

  

Hieronder een voorbeeld waarbij System.Net.Http.Jsonwordt verwijderd en Newtonsoft.Jsonword toegevoegd. 

  

<Project Sdk=“Microsoft.NET.Sdk.Web”> 

  <PropertyGroup> 

    <TargetFramework>net6.0</TargetFramework> 

    <Nullable>enable</Nullable> 

    <ImplicitUsings>enable</ImplicitUsings> 

  </PropertyGroup> 

  <ItemGroup> 

    <Using Remove=“System.Net.Http.Json” />    

    <Using Include=“Newtonsoft.Json” /> 

    <PackageReference Include=“Microsoft.AspNetCore.Mvc.NewtonsoftJson” Version=“5.0.11” /> 

  </ItemGroup> 

</Project> 

<Mening >

De feature Implicit Usings is een verborgen feature die standaard aanstaat bij het aanmaken van een project. Implicit Usings is sterk gelieerd aan het gebruik van Global Usings. Ik raad aan een keuze te maken tussen Implicit Usings of een file met Global Usings. Dit voorkomt dat er op verschillende plekken Global Usings wordt toegevoegd, en verhoogd dan ook de onderhoudbaarheid hiervan. 

Maak goede afspraken over het gebruik gebruik van Global Usings en Implicit Usings.  Persoonlijk maak ik één eigen file voor Global Usings in plaats van deze met implicit usings en de .csproj file toe te voegen. De reden is dat je .csprojal veel informatie bevat over afhankelijkheden naar andere projecten en packages. Hierdoor wordt je file groter. Daarnaast heb ik ondervonden dat in je project file IntelliSense niet helpt met het toevoegen van nieuwe namespaces aan de gegenereerde Global Usings.  

 

Door de standaard namespaces van de gebruikte sdk toe te voegen, is Implicit Usings een goede feature om aan te zetten. Dit voorkomt het zelf beheren van een sourcefile, voorkomt grootschalig onderhoud en menselijke fouten.