길이가 0인 배열을 할당하는 방법

null 참조를 대입하지 않도록 강제하는 코드를 작성하다보면, 배열을 만들 때 일단 길이가 0인 배열부터 만들고 시작하게 되는 코드를 넣게 되는 경우가 있습니다. 이 경우, 단순히 new XYZ[0]; 로 할당을 할 경우 이것이 누적되면 상당한 성능 오버헤드를 야기할 수 있는데요,

이에 대한 해결책으로 Array.Empty 메서드가 .NET Framework 4.6, 그리고 .NET Core 1.0부터 제공되어오기 시작했는데, 이 메서드는 단순히 new XYZ[0]; 표현식에 대한 syntax sugar가 아니라 내부적으로 싱글턴 인스턴스를 만들어 이를 대신 반환하도록 설계된 메서드라 적극 사용할 필요가 있습니다.

11개의 좋아요

참고 : CA1825: 길이가 0인 배열 할당 방지

class C
{
    public void M1()
    {
        // Violates rule CA1825.
        var a = new int[0];
    }
}
class C
{
    public void M1()
    {
        // Resolves rule CA1825 violation.
        var a = System.Array.Empty<int>();
    }
}
2개의 좋아요

성능과 상관없이 [] 사용 한지 반년 넘은 거 같습니다. 짧은게 최고 :rofl:

10개의 좋아요

IL 까지 뜯어 본거는 아닌데 [] 사용하면 컴파일러가 적절히 Array.Empty<T>로 바꿔 주는걸로 보이는군요.

추가) IL 결과를 추가했습니다.

var a = Array.Empty<int>();
int[] b = [];
    .method public hidebysig static 
	void Main () cil managed 
    {
	// Method begins at RVA 0x2050
	// Code size 14 (0xe)
	.maxstack 1
	.locals init (
		[0] int32[],
		[1] int32[]
	)

	IL_0000: nop
	IL_0001: call !!0[] [System.Runtime]System.Array::Empty<int32>()
	IL_0006: stloc.0
	IL_0007: call !!0[] [System.Runtime]System.Array::Empty<int32>()
	IL_000c: stloc.1
	IL_000d: ret
    }
11개의 좋아요

역시 최신 문법이 최고입니다. 또 하나 알아가네요 ㅎㅎ 감사합니다

5개의 좋아요

비슷한 맥락으로 Enumerable.Empty<T>() 있는데

이제는 그냥 [] 로 통일하면 다 잊어버리고 바이브 바이브…

그렇숩니다… ㅇㅅㅇ/

8개의 좋아요