C#
최신 C# 기능
C# 11
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# 10: 명료한 할당

먼저 명료한 할당(Definite Assignment, 혹은 한정된 할당으로 번역)이라는 용어의 의미를 살펴보자. 함수의 실행 코드의 특정 위치에서 컴파일러가 정적 코드 분석을 통해 변수값이 자동 초기화 되었거나 혹은 적어도 하나의 할당문에 의해 그 값이 할당되었는지 판단할 수 있을 때, 그 변수는 명료하게 할당(definitely assigned)되었다고 표현한다. 예를 들어, 다음과 같은 경우가 명료한 할당에 해당한다: 변수의 초기값이 할당되었을 때, 처음에 초기화 되지는 않은 변수에 대해 모든 실행 경로에서 적어도 어떤 값이 한번 할당될 때 등등.



C# 10: 향상된 명료한 할당

C# 10 이전에서는 명료한 할당과 관련하여 일부 불필요하게 컴파일러 에러를 내는 경우(False Positive)가 있었는데, C# 10에서는 이를 개선하여 불필요한 에러를 내지 않도록 하였다.

예를 들어, 아래 예제에서 C# 9.0은 변수 obj가 명확히 할당되었는 지 판단하지 못하고 CS0165: Use of unassigned local variable 'obj' 이라는 에러를 발생시킨다. 하지만, C# 10에서는 좀 더 향상된 분석을 통해 에러를 내지 않게 되었다.


예제

class Program
{
    static void Main(string[] args)
    {
        var t = new TestClass();
        Run(t);
    }

    public static void Run(TestClass t)
    {
        if (t?.GetObject(out object obj) == true)
        {
            // C# 9 (.NET 5)에서는 obj 변수값이 할당되었는 체크 못하고 에러 발생:
            // C# 10에서는 에러 없음.
            string s = obj.ToString();
        }
    }
}

class TestClass
{
    public bool GetObject(out object o)
    {
        o = new object();            
        return true;
    }
}



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