C#
최신 C# 기능
C# 12
C# 최신 기능
C# 12: 클래스 Primary Constructor
C# 12: 컬렉션 식
C# 12: ref readonly 파라미터 (in)
C# 12: 람다식 디폴트 파라미터
C# 12: InlineArray 특성
C# 12: using alias 모든 타입
C# 12: Experimental, Interceptor
C# 11
C# 11: Raw String Literal
C# 11: 문자열 내삽 복수라인
C# 11: u8 접미어
C# 11: Generic Math 지원
C# 11: Generic Attribute
C# 11: 리스트 패턴
C# 11: 파일 로컬 타입
C# 11: required modifier
C# 11: Auto-default struct
C# 11: ReadOnlySpan 패턴 매칭
C# 11: 확장된 nameof 범위
C# 11: nint, nuint
C# 11: ref 필드
C# 11: 소문자 타입명 경고
C# 11: 향상된 method group 변환
C# 10
VS 2022 설치
C# 10 global using
C# 10 File-scoped Namespace
C# 10 향상된 문자열 내삽
C# 10 향상된 람다식 유추
C# 10 struct 기능 향상
C# 10 record struct
C# 10 확장된 속성패턴
C# 10 향상된 명료한 할당
C# 10 Destructor 기능 개선
C# 9.0
C# 9 레코드 타입
C# 9 init accessor
C# 9 최상위 프로그램
C# 9 향상된 패턴 매칭
C# 9 향상된 Target Typing
C# 9 공변 리턴 타입
C# 9 Native Int 타입
C# 8.0
C# 8 디폴트 인터페이스 멤버
C# 8 패턴 매칭
C# 8 Nullable Reference Type
C# 8 인덱싱과 슬라이싱
C# 8 비동기 스트림
C# 8 using 선언
C# 8 널 병합 할당자
C# 8 구조체 읽기 전용 멤버
C# 8 기타 기능들
C# 7.0
C# 7.0 새기능
C# 7.0 패턴 매칭
C# 7.0 튜플
C# 7.0 로컬 함수
C# 7.0 out 파라미터
C# 7.0 리터럴 표현
C# 7.0 Deconstructor
C# 7.0 ref return
C# 7.0 async 리턴타입
C# 7.0 Expression-bodied
C# 7.0 throw expression
C# 6.0
C# 6.0 새기능
C# 6.0 널 조건 연산자
C# 6.0 문자열 내삽
C# 6.0 Dictionary초기자
C# 6.0 nameof 연산자
C# 6.0 using static문
C# 6.0 catch블럭 await
C# 6.0 Exception 필터
C# 6.0 자동 속성 초기자
C# 6.0 읽기전용 자동 속성
C# 6.0 Expression-bodied

C#으로 이해하는 자료구조
C# 프로그래밍 기초 실습 전자책
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);
    }
}
*/



본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.