Les mathématiques génériques dans .NET 7.0 incluent certaines interfaces dans l’espace de noms de la classe de base System.Numerics
qui permettent d’implémenter des opérations mathématiques de manière à ce qu’elles fonctionnent pour tout type de nombre – nombres entiers et fractionnaires de n’importe quelle longueur en bits.
Mourir dans .NET 6.0 marqué comme expérimental opérations mathématiques génériques comme INumber
, INumberBase
, IComparisonOperators
, IAdditionOperators
, IMultiplyOperators
et ISubtractionOperators
ont atteint la maturité de production avec .NET 7.0.
La liste suivante montre un exemple significatif d’un calcul mathématique générique dans la méthode Calc()
et une extraction générique d’un nombre à partir d’une chaîne dans ParseNumber()
. Entre autres choses, le type de nombre nouvellement introduit dans .NET 7.0 est inclus System.Int128
(entier, 16 octets) sont utilisés.
using System.Globalization;
using System.Numerics;
namespace CS11;
public class CS11_GenericMath
{
T Calc(T x, T y)
where T : INumber // Neues Interface mit
// static abstract Members!
{
Console.WriteLine(
$"Calc {x.GetType().ToString()}/{y.GetType().ToString()}");
if (x == T.Zero || y <= T.Zero) return T.One;
return (x + y) * T.CreateChecked(42.24);
}
T ParseNumber(string s)
where T : IParsable
{
return T.Parse(s, CultureInfo.InvariantCulture);
}
public void Run()
{
CUI.H2("Calc mit 1 und 2");
Console.WriteLine($"Ergebnis mit System.Byte:
{Calc((byte)1, (byte)2)}"); // 126
Console.WriteLine($"Ergebnis mit System.Int32:
{Calc(1, 2)}"); // 126
Console.WriteLine($"Ergebnis mit System.Int128:
{Calc( (Int128)1, (Int128)2)}"); // 126
Console.WriteLine($"Ergebnis mit System.Single:
{Calc((Single)1.0, (Single)2.0)}"); // 126,72
Console.WriteLine($"Ergebnis mit System.Double:
{Calc(1.0d, 2.0d)}"); // 126,72
Console.WriteLine($"Ergebnis mit System.Decimal:
{Calc(1.0m, 2.0m)}"); // 126,720
Console.WriteLine($"Ergebnis mit System.Half:
{Calc((Half)1.0m, (Half)2.0m)}"); // 126,75
CUI.H2("ParseNumber 1.00 und 2.00");
var x = ParseNumber("1.00");
var y = ParseNumber("2.00");
Console.WriteLine($"Ergebnis mit System.Single:
{Calc(x, y)}"); // 3,6000001
Console.WriteLine($"Ergebnis mit System.Int32:
{Calc(0, 1)}"); // 1
}
}
La contribution du langage de programmation C# ici est la possibilité de définir des membres abstraits statiques dans les interfaces, ce qui est possible expérimentalement depuis C# 10.0 et fait officiellement partie de la syntaxe du langage depuis C# 11.0. Microsoft utilise ce modificateur dans les classes de base comme INumberBase
.
public interface INumberBase
: IAdditionOperators,
IAdditiveIdentity,
IDecrementOperators,
IDivisionOperators,
IEquatable,
IEqualityOperators,
IIncrementOperators,
IMultiplicativeIdentity,
IMultiplyOperators,
ISpanFormattable,
ISpanParsable,
ISubtractionOperators,
IUnaryPlusOperators,
IUnaryNegationOperators
where TSelf : INumberBase?
{
/// Gets the value 1 for the type.
static abstract TSelf One { get; }
/// Gets the value 0 for the type.
static abstract TSelf Zero { get; }
…
/// Tries to parses a string into a value.
static abstract bool TryParse([NotNullWhen(true)] string? s,
NumberStyles style,
IFormatProvider? provider,
out TSelf result);
}
(rme)