개인 정리용

[C#] IntPtr & nint

0xff 2024. 4. 23. 20:59

C# 에서의 IntPtr은 본래부터 포인터 연산을 위한 값을 담기 위해 사용되었다.

nint는 C# 9 버전에 추가되었고, 그저 x86, x64에 따라 사이즈가 바뀌는 정수 타입으로만 사용되었었다.

 

어떻게 보면 IntPtr과 nint가 동일한 역할을 한다고 볼 수 있다.

IntPtr 또한 플랫폼에 따라 32, 64비트로 사이즈가 바뀌었으니 말이다.

 

하지만 C# 11 이전까지는 IntPtr과 nint가 공존하는 형태로 사용되어 왔었다.

 

C# 11 이전에서는 아래와 같은 연산이 불가능했다.

IntPtr a = new IntPtr(1);

// C# 10 이하에서 연산 불가
IntPtr b = a + 1;

 

하지만 nint는 단지 정수로 사용되었기 때문에 위와 같은 연산이 가능했다.

 

C# 11 부터는 nint 또한 IntPtr의 alias로 간주되면서 IntPtr에 대한 사칙연산이 지원되기 시작했다.

 

nint와 IntPtr의 구분과 제약 없이 사용이 가능해졌다는 말이다.

 

그러나 이는 컴파일러의 영향을 받기에 Target Platform이 C# 11 이하의 버전을 사용한다면 제대로 작동하지 않는다.

 

 

Refs:

https://anthonygiretti.com/2022/12/04/introducing-c-11-numeric-intptr-and-uintptr/