C# 12: 기타: Experimental 특성(attribute)
C# 12에서는 API에 실험적(향후 변경 및 삭제가 가능한) 신호를 컴파일러 수준에 주기 위해 Experimental 특성(attribute)을 사용할 수 있다.
이 [Experimental] 특성을 사용하면, 라이브러리 작성자는 특정 타입이나 멤버 사용 시 경고(또는 지정된 진단 아이디(Diagnostic ID))를 띄우게 할 수 있다.
이는 Preview 기능이나 실험적 API를 표시하는 용도로 사용한다.
예제
using System.Diagnostics.CodeAnalysis;
public class MyLib
{
[Experimental("MYEXP001")]
public static void MyExperimentalFeature()
{
}
}
public class Program
{
public static void Main()
{
// 아래 코드에 빨간 줄이 그어지며 다음과 같은 컴파일러 경고가 표시됨:
// MYEXP001: 'ConsoleApp.MyLib.MyExperimentalFeature()' is for evaluation purposes only
// and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
MyLib.MyExperimentalFeature();
}
}
C# 12: 기타: Interceptor
Interceptor는 컴파일 단계에서 특정 호출(call)을 다른 메서드로 가로채서 바꾸는 메커니즘이다.
일반 애플리케이션 코드에서 직접 쓰이기 보다는, 흔히 소스 생성기(source generator),
로깅/Dependency Injection/ORM 같은 프레임워크 레벨에서 호출 대체 최적화에 쓰이곤 한다.
즉, 일반 개발자가 늘 쓰는 기능이라기보다 고급/툴링 성격이 강하다.
아래 예제는 컴파일러 관점에서 원래 호출을 Interceptor하여 개념적으로 치환한 예이다.
실제로는 더 복잡한 코드들이 관여되지만, 개념적으로는 아래와 같이 특정 메서드 호출을 다른 메서드로 가로채는 형태로 단순화하여 예시한 것이다.
예제
[C# 코드 : Program.cs]
using Microsoft.Extensions.Logging;
void HandleLogin(ILogger logger, int userId)
{
logger.LogInformation("User {UserId} logged in", userId);
}
[컴파일러의 의해 Interceptor되어 처리된 C# 코드]
LoggerInterceptors.LogInformation_Intercept(
logger,
"User {UserId} logged in",
userId);
----------------------------------------------------------
/* 컴파일러가 생성한 Interceptor (Generated C#)
static class LoggerInterceptors
{
// 이 attribute가 어느 호출을 가로챌지를 지정
[System.Runtime.CompilerServices.InterceptsLocation(
"Program.cs@HandleLogin:logger.LogInformation(\"User {UserId} logged in\", userId)"
// 실제 값은 이런 문자열이 아니라 컴파일러가 요구하는 값(opaque)임
)]
public static void LogInformation_Intercept(ILogger logger, string message, int userId)
{
// 여기서 더 최적화된 경로로 넘김
LogDefinitions.UserLoggedIn(logger, userId);
}
}
*/
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.