Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 19개 있습니다.)

C# 9.0 - (1) 대상으로 형식화된 new 식(Target-typed new expressions)

C# 9.0 - (1) 대상으로 형식화된 new 식(Target-typed new expressions)
; https://www.sysnet.pe.kr/2/0/12363

C# 9.0 - (2) localsinit 플래그 내보내기 무시(Suppress emitting localsinit flag)
; https://www.sysnet.pe.kr/2/0/12364

C# 9.0 - (3) 람다 메서드의 매개 변수 무시(Lambda discard parameters)
; https://www.sysnet.pe.kr/2/0/12365

C# 9.0 - (4) 원시 크기 정수(Native ints)
; https://www.sysnet.pe.kr/2/0/12366

C# 9.0 - (5) 로컬 함수에 특성 지정 가능(Attributes on local functions)
; https://www.sysnet.pe.kr/2/0/12372

C# 9.0 - (6) 함수 포인터(Function pointers)
; https://www.sysnet.pe.kr/2/0/12374

C# 9.0 - (7) 패턴 일치 개선 사항(Pattern matching enhancements)
; https://www.sysnet.pe.kr/2/0/12383

C# 9.0 - (8) 정적 익명 함수 (static anonymous functions)
; https://www.sysnet.pe.kr/2/0/12389

C# 9.0 - (9) 레코드 (Records)
; https://www.sysnet.pe.kr/2/0/12392

C# 9.0 - (10) 대상으로 형식화된 조건식(Target-typed conditional expressions)
; https://www.sysnet.pe.kr/2/0/12399

C# 9.0 - (11) 공변 반환 형식(Covariant return types)
; https://www.sysnet.pe.kr/2/0/12402

C# 9.0 - (12) foreach 루프에 대한 GetEnumerator 확장 메서드 지원(Extension GetEnumerator)
; https://www.sysnet.pe.kr/2/0/12403

C# 9.0 - (13) 모듈 이니셜라이저(Module initializers)
; https://www.sysnet.pe.kr/2/0/12404

C# 9.0 - (14) 부분 메서드에 대한 새로운 기능(New features for partial methods)
; https://www.sysnet.pe.kr/2/0/12405

C# 9.0 - (15) 최상위 문(Top-level statements)
; https://www.sysnet.pe.kr/2/0/12406

C# 9.0 - (16) 제약 조건이 없는 형식 매개변수 주석(Unconstrained type parameter annotations)
; https://www.sysnet.pe.kr/2/0/12423




개발 환경도 알아봤으니,

C# 9.0을 위한 개발 환경 구성
; https://www.sysnet.pe.kr/2/0/12361

이제 C# 9.0의 신규 문법을 하나씩 알아봐야겠지요. ^^ 순서는, 아래의 문서 내용에 따라,

Language Feature Status - C# 9
; https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md#c-9

차례대로 테스트를 해보겠습니다. (참고로, 이번 시리즈 글은 특별한 언급이 없다면 ".NET Framework 4"를 대상으로 진행합니다.)




"Target-typed new"는 new로 개체를 생성할 때 타입명을 생략할 수 있는 문법입니다.

class Program
{
    static void Main(string[] args)
    {
        Point p = new(5, 6);
    }
}

struct Point
{
    int _x;
    public int X {  get { return _x; } }
    int _y;
    public int Y {  get { return _y; } }

    public Point(int x, int y)
    {
        _x = x;
        _y = y;
    }
}

하지만, 배열을 선언하는 경우에는 생략할 수 없습니다.

// 컴파일 정상
Point[] arr1 = new Point[5];

/*
컴파일 오류 발생
CS0178: Invalid rank specifier: expected ',' or ']'
*/
Point[] arr2 = new[5] { };




결과적으로 단순히 타이핑을 줄여주는 간편 구문인데, 사실 기존에도 Type 명을 모두 쓰지 않는 "var" 예약어가 있었습니다.

var p = new Point(5, 6);

따라서 일반적으로는 타이핑을 미세하게 좀 더 줄일 수 있는 정도의 추가 효과에 불과하지만, 이 기능을 배열 또는 컬렉션 내의 요소를 초기화할 때 사용하면 꽤나 유용하게 쓸 수 있습니다.

// 기존 8.0 이전 문법
Point[] linePt = new Point[]
{
    new Point(5, 6),
    new Point(7, 0),
};

// 신규 9.0 이후 문법
Point[] linePt = new Point[]
{
    new (5, 6),
    new (7, 0),
};

그러고 보니, 배열의 "new Point"에서 Point를 제거할 수 없는 아쉬움을, var로 달래볼 수는 있겠군요. ^^

var LinePt = new Point[]
{
    new (5, 6),
    new (7, 0),
};

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




아마도 배열 초기화의 경우 이렇게 더 줄여보는 것도,

var LinePt = new Point[]
{
    // 컴파일 오류: CS0029 Cannot implicitly convert type '(int, int)' to 'Point'
    (5, 6),
    // 컴파일 오류: CS0029 Cannot implicitly convert type '(int, int)' to 'Point'
    (7, 0),
};

좋을 듯합니다. 현재는 컴파일 오류가 발생하지만, 오류 메시지에서 보이는 것처럼 기존의 C# 7.0에 추가된 Deconstruct의 반대 역할을 하는 Construct 구문을 제공하면 될 텐데... 가능할까요? ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 11/22/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2020-11-06 03시15분
정성태
2020-11-09 10시50분
정성태

... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12719정성태7/19/20216550오류 유형: 737. SharePoint 설치 시 "0x800710D8 The object identifier does not represent a valid object." 오류 발생
12718정성태7/19/20217130개발 환경 구성: 581. Windows에서 WSL로 파일 복사 시 root 소유권으로 적용되는 문제파일 다운로드1
12717정성태7/18/20217075Windows: 195. robocopy에서 파일의 ADS(Alternate Data Stream) 정보 복사를 제외하는 방법
12716정성태7/17/20217904개발 환경 구성: 580. msbuild의 Exec Task에 robocopy를 사용하는 방법파일 다운로드1
12715정성태7/17/20219519오류 유형: 736. Windows - MySQL zip 파일 버전의 "mysqld --skip-grant-tables" 실행 시 비정상 종료 [1]
12714정성태7/16/20218314오류 유형: 735. VCRUNTIME140.dll, MSVCP140.dll, VCRUNTIME140.dll, VCRUNTIME140_1.dll이 없어 exe 실행이 안 되는 경우
12713정성태7/16/20218839.NET Framework: 1077. C# - 동기 방식이면서 비동기 규약을 따르게 만드는 Task.FromResult파일 다운로드1
12712정성태7/15/20218251개발 환경 구성: 579. Azure - 리눅스 호스팅의 Site Extension 제작 방법
12711정성태7/15/20218655개발 환경 구성: 578. Azure - Java Web App Service를 위한 Site Extension 제작 방법
12710정성태7/15/202110424개발 환경 구성: 577. MQTT - emqx.io 서비스 소개
12709정성태7/14/20217004Linux: 42. 실행 중인 docker 컨테이너에 대한 구동 시점의 docker run 명령어를 확인하는 방법
12708정성태7/14/202110429Linux: 41. 리눅스 환경에서 디스크 용량 부족 시 원인 분석 방법
12707정성태7/14/202177713오류 유형: 734. MySQL - Authentication method 'caching_sha2_password' not supported by any of the available plugins.
12706정성태7/14/20218851.NET Framework: 1076. C# - AsyncLocal 기능을 CallContext만으로 구현하는 방법 [2]파일 다운로드1
12705정성태7/13/20219025VS.NET IDE: 168. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 - 두 번째 이야기
12704정성태7/12/20218168개발 환경 구성: 576. Azure VM의 서비스를 Azure Web App Service에서만 접근하도록 NSG 설정을 제한하는 방법
12703정성태7/11/202113856개발 환경 구성: 575. Azure VM에 (ICMP) ping을 허용하는 방법
12702정성태7/11/20218957오류 유형: 733. TaskScheduler에 등록된 wacs.exe의 Let's Encrypt 인증서 업데이트 문제
12701정성태7/9/20218624.NET Framework: 1075. C# - ThreadPool의 스레드는 반환 시 ThreadStatic과 AsyncLocal 값이 초기화 될까요?파일 다운로드1
12700정성태7/8/20218993.NET Framework: 1074. RuntimeType의 메모리 누수? [1]
12699정성태7/8/20217798VS.NET IDE: 167. Visual Studio 디버깅 중 GC Heap 상태를 보여주는 "Show Diagnostic Tools" 메뉴 사용법
12698정성태7/7/202111768오류 유형: 732. Windows 11 업데이트 시 3% 또는 0%에서 다운로드가 멈춘 경우
12697정성태7/7/20217609개발 환경 구성: 574. Windows 11 (Insider Preview) 설치하는 방법
12696정성태7/6/20218238VC++: 146. 운영체제의 스레드 문맥 교환(Context Switch)을 유사하게 구현하는 방법파일 다운로드2
12695정성태7/3/20218283VC++: 145. C 언어의 setjmp/longjmp 기능을 Thread Context를 이용해 유사하게 구현하는 방법파일 다운로드1
12694정성태7/2/202110296Java: 24. Azure - Spring Boot 앱을 Java SE(Embedded Web Server)로 호스팅 시 로그 파일 남기는 방법 [1]
... 31  32  33  34  35  36  [37]  38  39  40  41  42  43  44  45  ...