programing

배열을 크기 0으로 초기화하면 어떻게됩니까?

goodcopy 2021. 1. 19. 08:03
반응형

배열을 크기 0으로 초기화하면 어떻게됩니까?


다음과 같은 기능이 있다고 가정 해 보겠습니다.

void myFunc(List<AClass> theList)
{
   string[] stuff = new string[theList.Count];
}

빈 목록을 전달합니다.

null 포인터가 될까요? 아니면 초기화되지 않은 메모리의 임의의 위치에 대한 포인터가 될까요?


빈 배열 객체를 생성합니다. 이것은 여전히 ​​완벽하게 유효한 객체이며 메모리에서 0이 아닌 공간을 차지하는 객체입니다. 여전히 자체 유형과 개수를 알고 있으며 요소가 없습니다.

빈 배열은 종종 변경 불가능한 빈 컬렉션으로 사용하는 데 유용합니다. 무한히 재사용 할 수 있습니다. 배열은 본질적으로 변경 가능하지만 요소 측면에서만 ... 그리고 여기서 변경할 요소가 없습니다! 배열의 크기를 조정할 수 없으므로 빈 배열은 완전히 변경할 수 없습니다.

null 참조 대신 빈 배열을 사용하는 것이 유용한 경우가 많습니다. 컬렉션을 반환하는 메서드 또는 속성 모든 호출자 가 null을 확인 하는 대신 일관성과 균일 성을 제공하므로 거의 항상 null 참조가 아닌 빈 컬렉션을 반환 해야 합니다 . 두 번 이상 할당하지 않으려면 다음을 사용할 수 있습니다.

public static class Arrays<T>
{
    private static readonly T[] empty = new T[0];

    public static readonly T[] Empty { get { return empty; } }
}

그런 다음 다음을 사용할 수 있습니다.

return Arrays<string>.Empty;

(또는 무엇이든) 특정 유형의 빈 배열에 대한 참조를 사용해야 할 때.


왜 그래야합니까? 그것은 완벽하게 유효한 크기 0의 배열을 가리킬 것입니다.

여기서 혼란은 크기가 0 인 배열 또는 null로 설정된 변수 (빈 문자열 또는 문자열 참조가 null로 설정된 문자열에 대해 동일한 모호성이 존재 함)로 데이터가 없음을 나타내는 모호성에서 발생한다고 생각합니다. 둘 다 그러한 부재를 나타내는 유효한 방법이며 단 하나만 갖는 것이 더 합리적 일 것입니다. 따라서 일부 데이터베이스 (Oracle 특히)에서 빈 문자열은 NULL 값과 같고 그 반대의 경우도 마찬가지이며 일부 프로그래밍 언어 (C #의 새 버전이 그중 하나라고 생각합니다)는 참조를 null이 절대로 지정하지 않도록 지정하여 모호성을 제거합니다.


이것은 좋은 코드입니다. 항목 (할당)이없는 Array 객체를 얻게됩니다.


stufftheList.Count모든 항목이로 초기화 된 길이 있는 배열에 대한 참조 default(string)null됩니다.


다음은 C # 언어 사양에 있습니다.

  • 치수 길이에 대해 계산 된 값은 다음과 같이 검증됩니다. 하나 이상의 값이 0보다 작 으면 System.OverflowException이 throw되고 추가 단계가 실행되지 않습니다.
  • 주어진 차원 길이를 가진 배열 인스턴스가 할당됩니다. 새 인스턴스를 할당하는 데 사용할 수있는 메모리가 충분하지 않으면 System.OutOfMemoryException이 throw되고 추가 단계가 실행되지 않습니다.

따라서 길이가 0 인 경우 메모리가 할당됩니다.


Linq .Concat는 인수 중 하나가 null이면 예외를 throw합니다 (내 경우에는 발생할 수 있음). 그래서 나는 내 코드에서 다음과 같이해야했다.

public string[] ConcatUsers(string[] users1, string[] users2)
{
    return (users1 ?? new string[0]).Concat(users2 ?? new string[0]).ToArray();
}

(0 크기 배열 이니셜 라이저가 유용 할 수있는 예)


경우 theList실제 인 List객체, 단순히 비어있는 다음 theList.Count선언이 될 것으로 0 어떤 수단을 반환하는 것입니다

string[] stuff = new string[0];

즉, stuff길이가 0 인 배열 (문자열) 일뿐입니다.


실제로 메소드에 전달하는 List <>가 어딘가에서 초기화되었는지 확인하는 한

List<Stuff> myStuff = new List<Stuff>;

목록은 널을 가리 키지 않습니다. 제로 스터프 목록이 될 것입니다.

참조 URL : https://stackoverflow.com/questions/3102353/what-happens-if-i-initialize-an-array-to-size-0

반응형