더북(TheBook)

state도 살펴보자. Create 메서드를 호출할 때 state를 전달해야 하는 이유는 무엇이며, 이렇게 전달된 state를 우리가 작성한 델리게이트까지 전달해야 하는 이유는 무엇일까? 다음은 Create 메서드를 이용해서 랜덤 문자열을 생성하는 간단한 예를 보여준다.

예제 13-23 string.Create를 이용해서 랜덤 문자열 생성 ▶ GenerateRandomString4.cs

static string Generate(string alphabet, Random random, int length) =>
    string.Create(length, (alphabet, random), (span, state) =>
    {
        var alphabet2 = state.alphabet;
        var random2 = state.random;
        for (int i = 0; i < span.Length; i++)
        {
            span[i] = alphabet2[random2.Next(alphabet2.Length)];
        }
    });

언뜻 보면, 이 코드는 무의미하게 반복되는 부분이 많아 보인다. string.Create의 두 번째 인수로는 (alphabet, rand)를 전달했는데, alphabetrandom 인수를 튜플로 묶어서 state 하나로 전달했다. 그리고 람다 표현식 내에서 이를 다시 분리했다.

var alphabet2 = state.alphabet;
var random2 = state.random;

그냥 람다 표현식의 캡처 기능을 이용해도 되지 않았을까? 람다 표현식 내에서 alphabetrandom을 직접 사용해도 제대로 컴파일되고 올바르게 동작할 텐데, 왜 귀찮게 state 매개변수를 이용하는 것일까?

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.