5

최근에 Visual Studio 2008에서 내 프로젝트를 Visual Studio 2010으로 업그레이드했습니다.CA1062를 숨겨야합니까? 공개 메서드의 인수를 확인 하시겠습니까?

이 코드 분석 규칙은 존재하지 않습니다.

이제이 규칙을 사용해야하는지 잘 모르겠습니다.

오픈 소스 라이브러리를 구축 중이므로 실수를 방지하는 것이 중요합니다. 그러나 매개 변수가 null 일 때 ArgumentNullException을 던지면 쓸모없는 코드를 작성하는 것처럼 보입니다. ArgumentNullException은 해당 코드를 쓰지 않을지라도 throw됩니다.

EDIT : 또한 성능 문제가 있습니다. 모든 공개 메서드에서 null을 확인하면 성능 문제가 발생할 수 있습니다.

해당 규칙을 삭제하거나 위반 사항을 수정해야합니까?

답변

6

달라질 수 있습니다. ArgumentNullException을 사용하는 관례는 설명에 null 인수의 이름을 포함시키는 것입니다. 따라서 발신자는 무엇이 잘못되었는지 정확하게 알 수 있습니다.

NullReferenceException의 원본 (유효성을 검사하지 않으면 발생합니다)은 쉽게 발견 될 수 있지만 메서드가 복잡하면 더 어려울 수 있습니다. 여러 참조가 null 일 수있는 코드 행이 생길 수 있습니다.

개인적으로 나는 메서드가 구현되는 방법에 관계없이 일관된 동작을 허용하기 때문에 개인적으로 public 메서드가 주어진 인수에 대해 null 입력을 처리 할 수없는 경우 ArgumentNullException을 throw하는 것을 선호합니다.

답장 : 제 생각에는 모든 코드 줄을 최적화하는 것보다 놀라움이 적은 일관된 인터페이스 집합을 제공하는 것이 더 중요합니다. 내 생각에 대부분의 경우 null 검사의 성능 오버 헤드가 중요하지 않습니다. 그것이 문제가된다면 (프로파일 링에서 말하는 것처럼) 나는 그것을 변경하는 것을 고려할 것이다. 그렇지 않으면 나는이 문제를이 시점에서 고려하지 않을 것이다.

+0

감사 . EDIT (성능 문제)를 해결할 수 있습니까? – brickner

+0

잘 perf 문제에 말했다. null 체크는 저렴하고 대개 null을 찾지 않습니다. – Stewart

3

첫 번째 항목의 매개 변수를 코드로 확인하는 것이 가장 바람직하다고 판단했기 때문에이 규칙을 계속 적용합니다. 그런 식으로, 당신의 코드를 사용하는 사람이 예외 상황을 얻을 때 그 안에있는 컨텍스트가 더 좋을 것입니다. 예를 들어 소스 코드가없는 사람은 예외가 코드에서 발생했음을 알게되고, 시간과 시간을 낭비하는 버그 보고서를 제출할 수 있습니다.

2

IMHO 아니요 null을 확인하면 응용 프로그램의 성능 병목 현상이 거의 없을 것입니다. (중요한 경우가있는 백만 가지 경우 중 하나에서 프로파일 러를 사용하여 해당 사례를 찾아서 제거합니다.)

당신의 마음에 형성되어야하는 다른 질문은 "새로운 NullReferenceException()이 오류를 처리하는 가장 좋은 방법입니다."입니다. 종종 사용자가 디버깅 목적으로 더 나은 오류보고를 제공하는 경우에도 사용자가 직접 처리 할 수 ​​있습니다. 대부분의 경우 코드는 정상적으로 null을 처리 할 수 ​​있기 때문에 오류가 전혀 발생하지 않아도됩니다. 널 검사는 정말 오래 걸리지 않습니다

편집

은 편집에 대답합니다. 메소드를 호출하기위한 오버 헤드는 널 체크보다 수십 배는 아니더라도 수십 일 것입니다.널 체크가 중요한 차이를 만들 수있는 유일한 곳은 당신이 거의 아무것도하지 않는 커다란 루프입니다. 이 상황은 자주 발생하지 않습니다. 대개 null을 확인한 다음 해당 참조로 비교적 비싼 것을 수행합니다.

충돌이나 실패가 좋은 상황은 없습니다. null 체크를 사용하여 고객의 데이터를 손상시키고 잃는 것보다 "애플리케이션 속도 저하"를하는 것이 항상 좋습니다.

코드를 중간에 최적화하지 마십시오. 유지 보수가 잘되고 튼튼하게 작성하고, profile 병목 현상이 어디 있는지 확인하십시오. 나는 28 년 동안 프로그래밍을 해왔고 널 체크로 매우 진보적이었고 을 결코 가지지 못했다.은 성능 문제의 원인이 null 체크 인 것을 발견했다. 대개 O (n^2) 접근법이 가능한 O (n^3) 알고리즘을 사용하여 값 비싼 계산 값을 캐시하지 못하는 루프를 통해 많은 불필요한 작업을 수행하는 것과 같은 것입니다.

관련 문제