C# 11-범위 지정 키워드 | Bart Wullems

Span<T>는 임의의 연속된 영역에 대한 형식 안전을 보장하며 최적의 속도를 보장합니다. 하지만 스택에 머물러야 하므로 제한적인데요, 다음의 코드는 request.Convert(values)에서 컴파일 오류가 발생합니다.

public ref struct ConversionRequest
{
        public ConversionRequest(double rate)
        {
            Rate = rate;
        }

        public double Rate { get; }

        public void Convert(Span<double> values)
        {
        }
}

public class Converter
{
        public void Handle(ref ConversionRequest request)
        {
            Span<double> values = stackalloc double[10];

            //Will not compile!
            request.Convert(values);
        }
}

이 때 Convert() 메소드의 매개변수 앞에 scoped를 붙이면 Convert() 메소드가 호출된 영역으로 제한하므로 정상 컴파일 됩니다.


5개의 좋아요

아니, C# 11에 이런 예약어가 추가되었군요, 저도 몰랐습니다. ^^;

블로그에 쓴 C# 11에 포함시켜야겠군요. ^^

5개의 좋아요

재밌게도 위 예제 코드에 Handle 메서드에 unsafe 키워드를 붙이면,
오류 메세지가 경고 메세지로 내려갑니다.
뜻은 똑같은데, unsafe 붙이고 쓰니 결과는 네가 책임져라 이런 뜻인가 봐요.

역시나 scoped로 values의 사용범위를 제한해서 안정성을 보장하면 경고도 해제됩니다.

3개의 좋아요

@kevin13 님이 관련해서 상세히 내용을 정리해주셨습니다.
https://www.sysnet.pe.kr/2/0/13276

https://www.sysnet.pe.kr/2/0/13275#ref_field

3개의 좋아요