Microsoft MVP성태의 닷넷 이야기
.NET Framework: 950. C# 9.0 - (4) 원시 크기 정수(Native ints) [링크 복사], [링크+제목 복사],
조회: 20085
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 18개 있습니다.)

C# 9.0 - (4) 원시 크기 정수(Native ints)

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




32비트 환경에서는 4바이트, 64비트 환경에서는 8바이트로 정의되는 nint, nuint 정수 타입이 새롭게 추가되었습니다.

using System;

class Program
{
    static void Main(string[] args)
    {
        nint x1 = 3;
        nuint x2 = 4;

        unsafe
        {
            Console.WriteLine(sizeof(nint));
            Console.WriteLine(sizeof(nuint));
        }
    }
}

/* 출력 결과
- 32비트의 경우
4
4

- 64비트의 경우
8
8
*/

기존에는 위와 같이 플랫폼 의존적인 타입을 갖는 네이티브 모듈들과 연동하기 위해서는 IntPtr/UIntPtr을 사용해야 했지만, 엄밀히 해당 자료형이 포인터가 아닌 경우도 있으므로 이를 위해 새로운 타입을 추가해 다양한 산술 연산자의 활용이 가능하도록 했습니다.

참고로, 비주얼 스튜디오에서 F12(Go To Definition)로 이동하면 각각 IntPtr, UIntPtr 타입으로 이동하는 것을 볼 수 있는데 실제로 내부적인 구현은 그것들에 대응합니다. 그렇긴 하지만 명시적으로 다음의 메서드들은 사용하지 못하도록 막았습니다.

// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-9.0/native-integers

public static IntPtr MaxValue { get; }
public static IntPtr MinValue { get;}
public static readonly IntPtr Zero; // use 0 instead
public static int Size { get; }     // use sizeof() instead
public static IntPtr Add(IntPtr pointer, int offset);
public static IntPtr Subtract(IntPtr pointer, int offset);
public int ToInt32();
public long ToInt64();
public void* ToPointer();

따라서 nint.Zero와 같은 식의 코드는 사용할 수 없습니다. 반면, IntPtr/UIntPtr의 경우에는 명시적으로 포인터 연산이라는 특징으로 포인터끼리 더하는 연산은 제공하지 않지만,

{
    IntPtr value1 = new (5); // Target-typed new
    IntPtr value2 = new (6);

    IntPtr value3 = value1 + value2; // Error CS0019 Operator '+' cannot be applied to operands of type 'IntPtr' and 'IntPtr'
}

nint, nuint는 이러한 연산이 가능합니다.

{
    nint value1 = 5; // IntPtr처럼 new 할 필요가 없음.
    nint value2 = 6;
    nint value3 = value1 + value2;
    nint value4 = value1 - value2;
    nint value5 = value1 / value2;
    nint value6 = value1 * value2;
    nint value7 = value1 % value2;
}

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




시간 되시면 다음의 문서도! ^^

Native-Sized Number Types
; https://github.com/dotnet/corefxlab/blob/master/docs/specs/nativesized.md




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

[연관 글]






[최초 등록일: ]
[최종 수정일: 3/9/2024]

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

비밀번호

댓글 작성자
 



2020-11-06 03시15분
C# 9.0: Native Int 타입 (nint, nuint)
; http://www.csharpstudy.com/latest/CS9-native-int.aspx
정성태

... 151  152  153  [154]  155  156  157  158  159  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1202정성태12/21/201125970오류 유형: 144. The database '...' cannot be opened because it is version 661.
1201정성태12/14/201141034디버깅 기술: 47. .NET Reflector를 이용한 "소스 코드가 없는" 어셈블리 디버깅 [4]
1200정성태12/11/201126927디버깅 기술: 46. Windbg 확장 DLL 만들기 (2) - Debugger Extension API 사용파일 다운로드1
1199정성태12/11/201128262VC++: 55. JNI DLL 컴파일 시 x86과 x64의 Export된 함수의 이름이 왜 다를까요? [2]파일 다운로드1
1198정성태12/9/201132056디버깅 기술: 45. Windbg 확장 DLL 만들기 (1) - 스레드를 강제 종료시키는 명령어 [2]파일 다운로드1
1197정성태12/9/201129829.NET Framework: 282. Shader 강좌와 함께 배워보는 XNA Framework (2) - RenderMonkey의 Shader/Model 파일 연동파일 다운로드2
1196정성태12/9/201133029.NET Framework: 281. Shader 강좌와 함께 배워보는 XNA Framework (1) - 기초 프로그램 구조 [3]파일 다운로드2
1195정성태12/8/201147689오류 유형: 143. DXSDK_Jun10.exe 설치 시 "Error Code: S1023" 오류 해결하는 방법 [4]
1194정성태12/8/201135464개발 환경 구성: 137. Visual C++ 런타임 구성요소에 대한 디버그 버전 설치하는 방법
1193정성태12/8/201122559오류 유형: 142. Windows Phone SDK 7.1 설치 시 Expression Blend 제거를 요구하는 경우
1192정성태12/8/201125582개발 환경 구성: 136. Windows 7 SP1의 IIS에서 사용자 프로파일을 로드하는 방법
1191정성태12/6/201126660.NET Framework: 280. MVC3에서 JavaScriptSerializer 재정의하는 방법파일 다운로드1
1190정성태12/6/201129847오류 유형: 141. Visual C++ 컴파일 오류 - error C2275: 'xxxxx' : illegal use of this type as an expression [1]
1189정성태12/6/201136890VS.NET IDE: 70. Visual Studio에서 프로젝트 로드가 안된다면?
1188정성태12/3/201126008개발 환경 구성: 135. 마이크로소프트 TFS 호스팅 서비스 - Preview [3]
1187정성태12/2/201130660개발 환경 구성: 134. Robocopy 오류 및 종료 코드
1186정성태12/1/201132497.NET Framework: 279. WPF - 그리기 성능 및 Blurring 문제파일 다운로드1
1185정성태11/29/201123289.NET Framework: 278. WPF - Content의 Changed 이벤트에 해당하는게 뭔가요?파일 다운로드1
1184정성태11/29/201126054.NET Framework: 277. F#과 WPF가 어울리지 못하는 근본적인 이유 [2]
1183정성태11/26/201121594오류 유형: 140. Visual Studio 2010 - Floating된 에디트 윈도우가 사라지지 않는 경우 [2]
1182정성태11/25/201157313.NET Framework: 276. 중복 없는 숫자를 랜덤으로 배열하는 방법 [5]파일 다운로드1
1181정성태11/24/201127777디버깅 기술: 44. windbg의 mscordacwks DLL 로드 문제
1180정성태11/23/201137592.NET Framework: 275. 레지스트리 등록 및 Interop DLL 없이 COM 개체 사용하는 방법 [2]파일 다운로드1
1179정성태11/22/201128184.NET Framework: 274. ReaderWriterLockSlim은 언제 쓰는 걸까요? [4]파일 다운로드1
1178정성태11/19/201124666.NET Framework: 273. 설치된 .NET 버전에 민감한 코드를 포함하는 경우, 다중으로 어셈블리를 만들어야 할까요?파일 다운로드1
1177정성태11/18/201129923.NET Framework: 272. 소켓 연결 시간 제한 - 두 번째 이야기 [1]파일 다운로드1
... 151  152  153  [154]  155  156  157  158  159  160  161  162  163  164  165  ...