새로운 INumber 유형을 사용하여 .NET 7에서 수학 함수 생성

.NET 7이 곧 출시될 예정이며 이미 많은 이점을 제공하고 있습니다.

이러한 개선 사항 중 작은 특정 항목은 정말 우아하며 더 나은 방법으로 숫자를 다루는 방법을 작성하는 데 도움이 될 수 있습니다. 바로 새INumber<T> 인터페이스입니다.

설정 🧰



이 기능은 아직 미리 보기 상태이므로 다음 코드를 실행하려면 .NET 7을 사용하여 새 프로젝트를 만들고 미리 보기 기능을 활성화해야 합니다.

내 콘솔 앱의 .csproj는 다음과 같습니다.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net7.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

</Project>


사용 사례 🔎



쇼핑 앱을 만들고 있고 카트를 확인하고 싶다고 상상해 봅시다. 현재 모든 가격 TTC는 어림수이므로 모두 합산하기 위해 다음과 같은 방법을 작성했습니다.

int CartValue(int[] numbers)
{
    var result = 0;
    foreach (var i in numbers) result += i;
    return result;
}


나중에 장바구니의 가치를 계산하기 위해 로직에서 이를 사용합니다.

var prices = new[] { 1, 2, 3 };
var sum = CartValue(prices);


그리고 그것은 훌륭하게 작동합니다!

까지 ...



그것은 훌륭하게 작동했지만 이제 우리는 가격과 함께 합산해야 하는 배송 및 기타 세금도 가지고 있으며 우리의 방법은 더 이상 작동하지 않습니다.

var pricesWithTaxes = new[] { 1, 2, 3, 1.5 };
var sumWithTaxes = CartValue(pricesWithTaxes);
// ^ This is not an int[] and won't compile


이 문제를 해결하기 위해 CartValue 대신 double[]를 수락하도록 int[] 메서드를 다시 작성한 다음 모든 숫자를 double로 변환하고 싶은 유혹을 느낄 수 있지만 .NET 7을 사용할 수 있고 브랜드가 있음을 확인했습니다. 이를 위한 새로운 기능

INumber 소개



이제부터 숫자는 INumber<T>의 유형에 관계없이 숫자에 대한 0, 더하기, 1 등과 같은 기본 수학 개념을 노출하는 T 인터페이스를 구현합니다.

우리의 경우, 이는 intdoubleINumber 동일한 개념을 노출한다는 것을 의미합니다(동일한 값은 아니지만).

모든 숫자의 배열을 받아들이도록 메서드를 다시 작성해 봅시다.

T CartValue<T>(T[] numbers)
    where T : INumber<T>  // <-- Don't forget the constraint!
{
    var result = T.Zero;
    foreach (var i in numbers) result += i;
    return result;
}


제공된 배열이 숫자임을 지정하기 위해 제네릭을 사용하기만 하면 우리의 방법이 다시 훌륭하게 작동하고 이전 코드가 이제 컴파일됩니다!

.NET 7에는 이 인터페이스 외에도 훨씬 더 많은 것이 있습니다. Microsoft가 프레임워크의 다음 버전에 대해 작성한 .NET 7 미리 보기 블로그를 확인하는 것이 좋습니다.

소중한 것을 배웠기를 바라며 좋은 하루 되세요!

좋은 웹페이지 즐겨찾기