할 수 있습니를 안전하게 무시 CodeAnalysis 경고:대체 string==""문자열.IsNullOrEmpty?

StackOverflow https://stackoverflow.com/questions/1661024

  •  12-09-2019
  •  | 
  •  

문제

나는 이와 유사한 코드:

string s = CreateString();
if (s == "") foo(s);

경 s 같음"",foo 호출되어야 합니다.문자열이 null 이면,해야 하는 일어나지 않,다음 든 괜찮다(이것은,결국,특별한 상황).

CodeAnalysis 말을 테스트하 s.IsNullOrEmpty.이것을 변경하는 기능에 nunintended 방법입니다.

성능이 문제가 되지 않습니다.

그것은 안전을 억제 관련 CA1820 경고?

편집: 업데이트 코드 샘플 및 문자를 반영합니다.

편집: 이것은(약간 변경)실제 코드(그것의 표준 IXmlSerializable 구현):

public void ReadXml (XmlReader reader)
    // ...
    string img = reader.ReadElementString ("Image");
    if (img != "") {
        Image = Image.FromFile(img);
    }
    // ...
도움이 되었습니까?

해결책

그것은 널과 관련하여 다르게 행동 할 것이므로, 당신이 원하는 일에 달려 있습니다. 당신은 그것을 언급합니다 NullReferenceException 괜찮을 것이지만, 인용 된 코드에는 이것을 제기 할 것이 없기 때문에 예상치 못한 오류가 다운 스트림을 유발할 수있는 이유가 없습니다.

난 절대로 가지다,하지만 나는 항상 다음을 추가하고 싶은 유혹을 받고 있습니다.

static bool IsNullOrEmpty(this string value) {
    return string.IsNullOrEmpty(value);
}

그래서 사용할 수 있습니다.

if (s.IsNullOrEmpty()) foo();

다른 팁

사양 :

s와 같은 경우 "", foo는 호출해야합니다. 문자열이 null이면 절대 일어나지 않아야한다면 NullReferenceException은 괜찮습니다.

단지 테스트 문자열 길이 CodeAnalysis 규칙에서 유죄 판결을 받았습니다 :

if (s.Length == 0) foo(s);

귀하의 질문 :

관련 CA1820 경고를 억제하는 것이 안전합니까?

당신은 그것을 무시할 수 있습니다. 당신의 코드는 작동하지만 조언하지는 않을 것입니다. 가이드 라인을 따르십시오 당신이 할 수있는만큼. 주제 (성능)가 문제가되지 않더라도 코드가 더 일관성이 있으며 표준 코드를 작성하는 데 익숙합니다.

모든 코드 분석 경고에는 경고를 하이러리하고 누르면 액세스 할 수있는 문서가 있습니다. F1. 항목을 마우스 오른쪽 버튼으로 클릭하여 도움을받을 수도 있습니다.

어쨌든 여기에 있습니다 특정 경고를 설명하는 문서.

이 문서에 따르면, "성능이 문제가되지 않으면이 규칙에서 경고를 억제하는 것이 안전합니다".

더 나은 것을 작성 테스트:

if(s != null && s == "")

할 수 있습니다 다음 프로세스에 null 값이 다른 경우 성명

당신은 실제로 경고를 무시하지 않고 코드를보고 경고가 적용되지 않기로 결정했습니다. 이것은 경고를 억제하는 완벽하게 합리적인 조건입니다.

순수한 추측

그러나 당신이하려는 일에 대해 조금 더 알고 있었으면 좋겠습니다. 나는 그것을 처리하는 더 좋은 방법이있을 수 있다고 생각합니다. 패턴은 메소드의 성공을 알리기 위해 오류 메시지를 반환하거나 비어 있음을 상기시킵니다. 이 경우, 빈 공간을 반환하고 실패에 대한 예외를 던지거나 부울을 반환하고 메시지가 중요 할 때만 예외를 던지고 그렇지 않으면 참/거짓을 반환하는 것을 고려할 것입니다.

null이 괜찮다면 어느 쪽이든 괜찮을 것입니다.

네.

그러나 나는 string.isnullorempty를 사용한 CodeAnalysis에 동의합니다.

예외를 다루지 않는 반면, 당신이 할 수있는 것은 나쁜 아이디어이므로 CA는 null을 비어 있거나 예외를 처리해야한다는 점에서 옳습니다. 리턴 값을 사용하여 발생하는 Null 참조 예외는 매우 나쁜 것입니다. 최소한 Debug.assert (s! = null)에 넣고 string.empty와 비교하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top