자주 못보는 C# 키워드와 문법 모음

여기 있는 문법들을 한 번 이상 써보셨다면 정말 깊이있게 오랫동안 C#을 사용해오셨다고 볼 수 있습니다. :laughing:

참고로 __arglist, __makeref, __refvalue, __reftype 키워드는 닷넷 코어 초창기에는 한동안 지원되지 않다가, 닷넷 6에서 다시 기능이 복원된 것을 확인했습니다. 그래서 printf 같은 함수를 호출하기 위해 __arglist를 함수 시그니처로 지정하고, 여기에 __arglist로 varargs 포인터를 넣는 행위가 다시 가능해졌습니다.

재미있는 것은 위 키워드들을 쓰기 위해서 unsafe 컴파일러 스위치는 막상 쓸 필요가 없습니다. 그러나 __arglist를 써서 public 메서드를 만들면 C# 코드 끼리만 호출할 수 있는 특수 함수가 되어버려서 CLSCompliant 체크에서는 경고가 부여됩니다. (즉, F#이나 VB.NET에서는 이렇게 만든 함수는 호출이 불가합니다.)

그리고 실제로 쓸 일은 없겠습니다만, printf의 동작 방식을 모사하는 C# 코드도 아래와 같이 작성할 수 있습니다. 아래는 코드 예시입니다. C 언어 예제로 치면 va_list, va_start, vprintf, va_end를 쓴 것과 기술적으로 같습니다. (출처: ArgIterator? 이 구조체는 어디에 사용되는 녀석일까? :: 꿈꾸는 프로그래머)

using System;
namespace TestApp {
    public class TestApp {
        public static void Main(string[] args) {
            FunWithArgList();
            Console.ReadKey(true);
        }
        private static void FunWithArgList() {
            FunWithArgListBack(__arglist(1, 2, 3, "문자열", 'c', "__arglist", null));
        }
        private static void FunWithArgListBack(__arglist) {
            ArgIterator ai = new ArgIterator(__arglist);
            Int32 ArgCount = ai.GetRemainingCount();
            for ( Int32 i = 0; i < ArgCount; i++ ) {
                TypedReference tr = ai.GetNextArg();
                Console.WriteLine("Arg #{0}: {1,-20} ({2})", i, TypedReference.ToObject(tr), __reftype(tr));
            }
        }
    }
}
7개의 좋아요