닷넷 10의 신규문법과 혼종

안녕하세요. 오늘 닷넷10관련해서 이것저것 보다보니 이런 혼종도 만들 수 있구나하면서 한번 공유드립니다.

해외 Reddit에서도 얘기가 나오는중인것 같습니다.

우선 기존 닷넷9에서의 사용법을 보여드리겠습니다.

public static class PipeExtensions
{
    public static TResult Pipe<T, TResult>(this T value, Func<T, TResult> func) => func(value);
}

// Program.cs
var number = args[0]
    .Pipe(int.Parse);

Console.WriteLine(number);

자주 쓰는 확장메소드라면 이런식으로 많이 분리해서 사용하기도 하죠.

근데 이게 닷넷 10에 오면서

public static class PipeOperator
{
    extension<T, TResult>(T)
    {
        public static TResult Pipe(T source, Func<T, TResult> func) 
          => func(source); 
    }
}

위와 같이 깔끔하게 쓰는 수준을 넘어서, operator (연산자 오버로딩) 라는 키워드가 섞일 수 있게되면서

public static class PipeOperator
{
    extension<T, TResult>(T)
    {
        public static TResult operator | (T source, Func<T, TResult> func)
            => func(source);
    }
}

// Program.cs
var number2 = args[0] | int.Parse;
var number3 = args[0] | int.Parse | (x => x * 2);

Console.WriteLine(number2);

ㅋㅋ..

영상 공유드리면서 마치겠습니다

나름, 운영레벨에서는 비추했습니다.

여러분들도 아 이렇게도 쓸 수 있구나~ 하고 넘겨주시면 될 것 같습니다!

6개의 좋아요

오 코드는 상당히 깔끔해지네요!

3개의 좋아요

오~ 멋집니다!

3개의 좋아요

신비하네요!

1개의 좋아요

혹시? 싶어서 C++ 처럼 cin/cout/endl도 만들 수 있나 끄적여봤는데 여기까지는 안되는군요 ㅋㅋ 그나마…

var cout = Console.Out;
var endl = Environment.NewLine;
_ = cout << "Hello, " << "World!" << endl;

public static class StreamOperator
{
    extension<T, TTextWriter>(TTextWriter writer) where TTextWriter : TextWriter
    {
        public static TTextWriter operator <<(TTextWriter w, T source)
        {
            w.Write(Convert.ToString(source));
            return w;
        }
    }
}

요 정도가 최선인 것 같습니다. ㅋㅋ

4개의 좋아요

앞으로 다가올 흑마술 중 하나입니다.

haskell fish operator의 C# 버전 :woozy_face:

3개의 좋아요

어질어질하네요.

1개의 좋아요

알려주셔서 좀 살펴봤는데, F#을 쓰는 것에 비할 것은 아니지만 C#에서도 꽤 그럴듯한 함수형 프로그래밍 패러다임을 채용할 수 있게 만들어준 흥미로운 라이브러리네요!

좋은 라이브러리 정보 공유해주셔서 감사합니다! :person_bowing:

2개의 좋아요