[.net] 'null'또는 빈 배열을 반환해야합니까?


Answers

.NET에서는 널 검사를 작성하거나 NullReferenceException 감수해야하는 호출자를 저장하기 때문에 null보다 빈 배열을 반환하는 것이 좋습니다. 이것이 기본 클래스 라이브러리의 공통 패턴임을 알 수 있습니다. 이 작업을 수행하지 않는 유일한 경우는 드문 경우이지만 빈 배열과 null에는 의미 적 의미가 다릅니다.

공식적인 배열 사용 지침 상태 :

일반적인 규칙은 null, 빈 문자열 ( "") 및 빈 (0 항목) 배열은 동일한 방식으로 처리되어야한다는 것입니다. null 참조가 아닌 빈 배열을 반환합니다.

즉, .NET 2.0 이상을 사용하는 경우 IEnumerable<T> 또는 Collection<T> , ReadOnlyCollection<T> , ICollection<T> 또는 IList<T> ICollection<T> 와 같은 확장 가능한 파생물 중 하나를 반환하는 것이 훨씬 좋습니다. IList<T> (이 경우 여전히 null 대신 빈 값을 반환하는 경향이 있습니다). 이것이 선호되는 이유에 대한 자세한 정보는 Eric Lippert의 블로그에서 찾을 수 있습니다 .

Question

어떤 종류의 배열을 생성하고 리턴해야하는 메소드가 있다고 가정하십시오. 배열에 데이터가 채워지지 않으면 어떻게 될까? 빈 배열 또는 null / nothing을 반환합니까?




질문을 면밀히 읽으면 자신이 실제로 이미 대답했음을 깨닫게 될 것입니다. 여러분은 "어떤 종류의 배열을 생성하고 반환해야하는 메서드가 아니라" 정렬 또는하지 않음 ".

실제로 그것은 사양에 따라 다릅니다. 그러나 당신이 그것을 표현한 방식으로, 메서드가 null을 반환 할 수있는 방법이 없습니다. 어쨌든 내가 선호하는 스타일은 어느 것인데, 가장자리 처리만으로 쉽게 처리 할 수 ​​있습니다.




나는 이것이 언어가 그것을 다루는 방식에 달려 있다고 생각한다.

C에서는 포인터를 전달하고 항상 배열의 크기 인 포인터를 포함합니다. 호출 함수는 배열과 배열 크기의 두 가지를 제공해야합니다. 함수가 배열을 채우지 않으면 동일한 포인터를 반환하고 배열 크기에 아무 것도하지 않습니다. 보통 나는 벡터 타입의 구조체를 구현하고이를 사용한다.

perl에서는 배열 크기가 암시 적으로 처리되므로 빈 배열을 반환하거나 오류가 발생하면 오류 코드 변수를 수정하고 undef를 반환합니다.

자바에서는 ArrayLists를 사용하고 size 속성을 사용합니다.




정말 호출자가 결과로 무엇을하고 싶은지에 달려 있습니다.

대개 빈 배열 (또는 Java의 Collection)을 반환합니다. 왜냐하면 저는 대개 루프를 거쳐 콜렉션에 선택적으로 추가 한 다음 반환합니다. 마지막에 Collection.size() == 0 이 추가 단계인지 확인하십시오. 호출자는 결과가 0인지 확인하기 위해 추가 검사를 추가해야합니다. 그렇다면 콜렉션을 반복하지 마십시오.

null을 반환하는 것이 더 깔끔할 수도 있지만 감사합니다. 이유가 없으면 쉽지 않습니다.




이 질문에 대한 귀하의 대답은 아마도 당신이 작업하고있는 언어에 따라 크게 달라질 것입니다. C와 같은 언어에서는 배열이 시작되는 일부 메모리 주소에 대한 포인터이기 때문에 빈 배열을 반환 할 수 없습니다. 이 경우 유일한 옵션은 null 포인터를 반환하는 것입니다.




발신자가 기대하는 것을 반환합니다. 함수가 "X가 true 인 모든 객체"를 반환하고 객체에 대해 X가 true가 아닌 경우 빈 배열을 반환합니다.

함수가 "X가 true 인 객체"에 대해이 검색을 수행 할 수조차 없다면, 실패하고 어떻게 든 호출자에게 다시 신호해야합니다. null을 반환하여이를 수행 할 수 있습니다.




C #을 사용할만큼 운이 좋다면 정적 읽기 전용 속성을 다음과 같이 선언하십시오.

public static class ArrayUtil<TElement> 
{
    public static readonly Empty = new TElement[0];
}

(이것은 BCL에 있습니까? 왜 안됩니까?)

이제 ArrayUtil<int>.Empty 또는 무엇이든 반환 할 수 있습니다. 이것은 null 대신 빈 배열을 사용하는 데 드는 런타임 비용을 거의 없애고 호출자에게 null을 처리하는 것보다 간단한 시간을줍니다.




글쎄, 그것은 정말로 당신이 당신의 반환에주고 싶은 의미론에 달려 있습니다.

일반적으로 거의 모든 함수 / 메소드에 대해 사전 및 사후 조건을 사용합니다. 즉, 내 메서드가 특정 처리에서 데이터가있는 배열을 반환해야하는 경우이 처리가 실패하면 개체가 null이어야하고 게시 조건이 실패합니다.

하지만 귀하의 경우에는 귀하가 DbC를 사용하지 않는다고 가정합니다.

배열에 데이터가 채워지지 않으면 어떻게 될까?

그렇다면 나는 당신의 말투에서 someting이 잘못되었다고 생각했기 때문에 null을 리턴 할 것입니다.




어떤 이유로 인해 null 배열과 평범한 오래된 빈 행과의 결과에 대한 코드에서 의미의 차이가 없으면 빈 행을 반환합니다. 이것은 또한 특정 언어 일 수도 있습니다. 일부 언어에는 하나의 옵션 만있을 수 있습니다.




빈 배열을 반환합니다. - 할 일이 옳은 것처럼 보입니다.




대답은 호출자와 함수 간의 계약에 따라 다릅니다. 배열이 유효하지 않은 것으로 플래그를 지정하려는 경우, 0 크기 배열이 특정 상황에서 유효한 결과 일 수 있기 때문에 null은 0 크기 배열을 반환하는 것보다 더 나은 방법입니다.




이 언어가 정말로 언어 독립적 인 경우, 대부분의 컨테이너에는 IsEmpty ()와 같은 함수가 있어야합니다. 그래서 함수의 호출자는 Array IsEmpty가 무엇인가를하기 전에 검사 할 것입니다.

이 C ++ 경우 null 중 하나를 볼 수 또는 배열에 대한 참조를 전달한 다음 배열 크기 반환 ...