Wat is er nieuw in C# 10:nieuwe mogelijkheden voor validatie- en logmethoden

Wat is er nieuw in C# 10:nieuwe mogelijkheden voor validatie- en logmethoden

Dit maakt deel uit van een serie over de nieuwe functies die zijn geïntroduceerd met C# 10.

Vanaf C# 10 kunnen we gebruik maken van de [CallerArgumentExpression] attribuut.

Dit attribuut kan worden toegepast op een parameter om informatie te krijgen over een andere gespecificeerde parameter in de methode.

Neem de volgende methode als voorbeeld:

static bool ValidInput(string? inputFromUser,
                string inputDataName,
                bool validationCondition,
                out string? validationErrorMessage,
                [CallerArgumentExpression("validationCondition")] string? validationConditionText = null)
{
    if (validationCondition)
    {
        validationErrorMessage = null;
        return true;
    }

    validationErrorMessage = $"input '{inputFromUser ?? "null"}' from user for {inputDataName} is invalid because '{validationConditionText}'";
    return false;
}

Bij deze methode wordt de validationConditionText argument heeft de [CallerArgumentExpression] toegepast.

Wanneer u de [CallerArgumentExpression] . gebruikt attribuut moet u een enkele constructorparameter opgeven. Dit is een stringparameter die aangeeft over welke van de andere parameters we informatie willen vastleggen. In dit geval is dit de bool validationCondition parameter.

We zouden deze methode kunnen gebruiken in een consoletoepassing:

using System.Runtime.CompilerServices;
using static System.Console;

WriteLine("Please enter your user name");
string? userName = ReadLine();

WriteLine("Please enter your age");
string? age = ReadLine();

string? validationErrorMessage;

if (!ValidInput(userName,
                inputDataName: "user name",
                validationCondition: userName is not null,
                validationErrorMessage: out validationErrorMessage))
{
    WriteLine(validationErrorMessage);
}

if (!ValidInput(inputFromUser: age,
                inputDataName: "age",
                validationCondition: age is not null && int.TryParse(age, out _),
                validationErrorMessage: out validationErrorMessage))
{
    WriteLine(validationErrorMessage);
}

ReadLine();

Elke keer dat we de ValidInput . aanroepen methode, geven we een Booleaanse expressie door waaraan moet worden voldaan voordat de invoer als geldig wordt herkend, bijvoorbeeld:gebruikersnaam is niet null .

Als we de console-app hebben uitgevoerd en een null hebben ingevoerd voor gebruikersnaam en wat niet-numerieke invoer voor leeftijd:

Please enter your user name
^Z
Please enter your age
aaa
input 'null' from user for user name is invalid because 'userName is not null'
input 'aaa' from user for age is invalid because 'age is not null && int.TryParse(age, out _)'

Merk op dat de uitvoer van twee validatiefoutberichten de booleaanse uitdrukking bevat die in de broncode wordt gebruikt:gebruikersnaam is niet null en leeftijd is niet null &&int.TryParse(age, out _) .

De [CallerArgumentExpression] attribuut haalt die uitdrukkingen eruit en geeft ons toegang als tekenreeksen die tijdens runtime kunnen worden gebruikt.

Dit soort gebruikersvalidatie is niet het primaire beoogde gebruiksscenario voor dit kenmerk, aangezien het vertellen aan een eindgebruiker 'leeftijd is niet null &&int.TryParse(age, out _)' niet erg nuttig of gebruiksvriendelijk is, maar het bovenstaande voorbeeld illustreert de mogelijkheden. Deze aanpak kan nog steeds worden gebruikt met een meer generiek foutbericht dat aan de gebruiker wordt gegeven en een meer gedetailleerd bericht naar logboeken/sporen. In de Microsoft-documentatie staat:"Diagnostische bibliotheken willen misschien meer details geven over de expressies doorgegeven aan argumenten. Door naast de parameternaam de expressie op te geven die de diagnose heeft geactiveerd, hebben ontwikkelaars meer details over de voorwaarde die de diagnose heeft geactiveerd. Die extra informatie maakt het makkelijker om het op te lossen.”

Als je de hiaten in je C#-kennis wilt opvullen, bekijk dan zeker mijn C# Tips and Traps-trainingscursus van Pluralsight - ga aan de slag met een gratis proefversie.