배열을 크기 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 객체를 얻게됩니다.
stuff
theList.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
'programing' 카테고리의 다른 글
Django request.POST에서 선택된 모든 체크 박스의 값을 어떻게 얻나요? (0) | 2021.01.19 |
---|---|
html로 테이블 행을 그룹화하여 jquery로 조작하는 방법 (0) | 2021.01.19 |
Go의 "알 수없는 이스케이프 시퀀스"오류 (0) | 2021.01.19 |
TFS에서 사용자의 모든 "변경 집합"목록을 가져 오는 방법은 무엇입니까? (0) | 2021.01.19 |
삼중 결장 스칼라 (0) | 2021.01.19 |