2009-11-06 6 views
14

Session 변수로 String.IsNullOrEmpty를 잘못 사용한 작업에서 동료 동료가 String.IsNullOrEmpty 사용을 거부합니다. 몇 가지 조사 후, 분명히 MSDN (link)에 IsNullOrEmpty 나열된 버그 (하단에 메모를 읽기) 거기에 4 월 4, 2006 년C# String.IsNullOrEmpty : 좋든 나쁘니?

, 그하게합니다 (JIT에서 가능) 버그 있다 최적화가 인 경우이 메서드가 실패합니다. C#과 VB 모두에 영향을 미치는 것으로 알려져 있습니다.

자세한 내용은 여기 (link)에서 찾을 수 있습니다. Microsoft는 버그가 'Orcas'로 바뀌었지만 유감스럽게도 내 고용주는 여전히 VS2005를 사용합니다. 그러나 문제가 2008 년에 수정 된 경우에도 마찬가지입니다. 그건 나와 잘 맞습니다. 나에게 IsNullOrEmpty 내 코드의 내 동료의 거부는 시각 장애인 무지이지만 하지 세션 변수를 오용 이외는 다른 사용하는 이유

(IMO) 그는 확실히 말해 수 없습니다. 나는 문제없이 IsNullOrEmpty를 코드 전체에 사용했다. 개인적으로 한 문장에서 두 가지 일을하는 것 외에도 훨씬 더 읽기 쉽다고 생각합니다.

주제에 대한 의견을 검색 한 결과, 찬성/반대 의견을받는 사이트를 찾았습니다. 여기에 내가 이것에 대해 읽은 사이트의 일부입니다 :

https://blog.rthand.com/post/2006/06/22/1063.aspx

http://www.omegacoder.com/?p=105

한 사이트 (http://dotnetperls.com/isnullorempty) 꽤 잘하는 방법 (IMHO) 요약 : 여기

을 우리 그 문자열 형식에 대한 메서드를 찾고있는 좋은 를 확인하는 상대적으로 좋은 비교적 우리에게 제공하는 어떤 방법을 보았다.문자열을 저장하거나 사용하는 것이 좋습니다. 그러나 성능이 인 경우 수동 null 확인을 사용하는 것이 좋습니다. 빈 문자열 은 다른 방법으로도 테스트 할 수 있으며 여기 내 연구는 길이가 가장 빠릅니다.

버그 수정 장소에 가정 (제대로 작동)/2010 VS2008/등.에, VS2005로하고 넘어 String.IsNullOrEmpty를 사용하는 어떤 이유 하지이있다? 나는 이것이 어리석은 작은 방법에 대해 조금 지나치게 과장된 것처럼 보일지 모른다는 것을 깨닫는다. 그러나 나는 누군가가 대안적인 설명을하고 있다면 그 장면 뒤에 더 많은 것이 있는지 알고 싶다.

답변

24

이 문제는 .NET 2.0 sp1에서 수정되었습니다. 지금은 그 사용을 피할 이유가 없습니다.

.NET 2를 사용하는 경우 어쨌든 많은 다른 이유로 sp1을 사용해야합니다. 더 이상 존재하지 않는 버그를 피할 이유가 없습니다.이 버전에 깨진 경우

+0

감사합니다. 아직 서비스 팩이 설치되어 있지 않은 경우 서비스 팩을 얻는 방법에 대해 알아 보겠습니다. 나는 뛰어 내야 할 모든 농구를 잘 모릅니다. 그러나 어느쪽으로 든, 우리는 우리 웹 서버의 최신 서비스 팩을 상관없이 실행해야합니다. 감사! – osij2is

0

은, 그래서 그냥 이렇게 그냥 확인을 할 것입니다 정적 메서드를 가지고 간단하다 :

public static bool isNull(String s) { 
    return s == null || s.trim().length == 0; 
} 

뭔가 이상 큰 문제로 점점 아무 소용이 수정하기가 비교적 쉬워야합니다.

하나의 정적 방법을 다른 방법으로 전역 대체 할 수 있지만 모든 곳에서 변경할 필요는 없습니다.

+0

프레임 워크 기능을 복제 할 이유가 없습니다. 이것은 .net 2.0sp1에서 수정 된 버그입니다 - 지금 그것을 피하십시오? –

+0

고마워, 네, 동의합니다. 그렇게 사소한 것 이상의 큰 일을 할 필요는 없지만 그것이 패치 된/사용되지 않는 한 나는 그것을 사용하지 않을 이유를 찾을 수 없었습니다. 교체 코드 주셔서 감사합니다. 나는 그것을 구현할 수있다. – osij2is

+0

@ Reduce Copsey - 영향을받는 경우 .NET2sp1로 업그레이드하지 않았을 수 있습니다. 물론, 업그레이드를해야하지만, 그다지 중요하지 않은 것에 관해서 싸우는 것이 아니라면, 주위를 둘러싼 다. –

4

이 물건을 테스트하고 2008 년 VS2005 년 이후를 실행하고에서 그 버그 보고서에

+0

불행히도, 현재 나의 고용주는 실제로 단위 테스트를 구현하지 않습니다. 나는 그 기회에 뛰어 들지는 않을 것이지만 그 아이디어에 감사드립니다. 어쩌면 경영진에게 우리가 단위 테스팅을해야한다고 주장 할 수있는 또 하나의 이유 일 수도 있습니다. – osij2is

2

무슨 일이 있었는지보기 위해 널 (null) 문자열을 전달 빈 문자열을 전달하는 단위 테스트를 작성할 수 링크 포함 상태 :

이 버그는 Microsoft .NET Framework 2.0 서비스 팩 1 (SP1)에서 수정되었습니다.

.NET 2 용 SP1이 설치되어있는 한 VS 2005를 사용하고 있는지 여부는 중요하지 않습니다.

사용 여부는 post by CodingHorror입니다.

1

나는 그것이 SP1에 고정 확신하지만, 어쨌든 당신이 당신의 자신의 null 또는 빈 방법 : 언어 또는 그 부분과 마찬가지로

1

를 만들 수 있습니다, 모든 프로/단점을 알고 및 제작에 관하여 그 정보에 기초한 교육 된 결정. IMHO.

+0

"... 장점/단점을 알고 그 정보를 바탕으로 교양있는 결정을 내리는 것이 전부입니다." - 그게 왜 * 왜 여기 묻는거야? * 결정 *하고 * 교육 * 결정? – osij2is

+0

@ osij2is - 내 의견은 모욕적 인 의도가 아니 었습니다. 다른 사람들은 벌레가 고쳐 졌다고 이미 말했기 때문에 나는 그 해답을 반복 할 필요가 없다고 느꼈다. 나는 단순히 당신과 당신의 동료 사이의 견해 차이에 대한 나의 견해를 밝히고있었습니다. 이제 솔루션이 완벽하게 받아 들여진다는 것을 알게되면, 이제는 그것이 왜 좋은지에 대한 논쟁이 있습니다. IMHO :) – jaywon

3

우리는 string.IsNullOrEmpty에 대한 확장 방법을 사용하십시오

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

는 일부 이전 버전의 파산하더라도,이 방법을 사용, 버그 수정 코드의 한 라인이다.

그리고 null이 될 수있는 문자열 인스턴스의 방법을 사용할 수있는의 추가 유틸리티 : 전에 그 버그에 대해 들었습니다

string myString = null; 
if (myString.IsNullOrEmpty()) 
{ 
    // Still works 
} 
+0

VS2005는 확장 기능과 작동하지 않습니다. 나는 글을 쓰는 것이 자연 스럽다는 이유로 확장 프로그램을 사용하는 경향이 있습니다. –

+0

VS2005가 문제라고 생각하지 않습니다. 그는 .NET 2.0 이전 SP1 프레임 워크 버전을 사용하고 있습니다. C# 3.0 확장 메서드로 시작했지만 2.0 프레임 워크 라이브러리에서 작은 조정을 통해 완벽하게 사용할 수 있습니다. http://geekswithblogs.net/robp/archive/2007/12/20/using-extension-methods- 비주얼 스튜디오 2008과 함께 .net-2.0.aspx –

+0

인스턴스가 null 일 때 확장 메서드를 성공적으로 호출 할 수 없다는 아이디어는 아직 없습니다. –

5

, 나는 그것을 결코 발생하지 무엇을 수집 할 수 있습니다에서 모든 실제 코드는 실제로는 아무 것도하지 않는 예제와 같은 코드에서만 사용할 수 있습니다. 게다가 버그는 IsNullOrEmpty 메서드 자체가 아니기 때문에 문자열 검사 방법에 관계없이 발생합니다.

이 방법으로 수행하려는 작업이 정확하게 수행되면 사용해야합니다. 그러나 빈 문자열을 확인하기 위해 모든 상황에서 사용해서는 안됩니다. 때로는 문자열이 비어 있는지 그리고 null인지 아닌지 확인하기를 원할 때가 있습니다. 변수 인 경우

if (str.Length > 0) { ... } 

: 문자열 변수가 null

if (!String.IsNullOrEmpty(str)) { ... } 

경우,이 예외가 발생할 것이다

문자열 변수가 널이면

, 이것은 단지 코드 블록을 건너 뛰기 널 (null)이 아닌 것으로 가정하면, 널 값을 빈 문자열로 취급하는 코드 대신 예외를 원할 수 있습니다.무언가 잘못 되었다면 가능한 한 빨리 잡으려고합니다. 원인을 예외적으로 오랫동안 소스로 추적하는 것이 더 어려울 것이기 때문입니다.

+0

따라서 항상 IsNullOrEmpty 메서드를 항상 선호합니다. 하나의 간단한 단계에서 두 가지 작업. 문자열에 관해서는 대부분의 사람들이 한 쪽 또는 다른 쪽 (빈 대 null)에 대해 코드를 작성하는 경향이 있지만 드물게 두 사람 모두에 대해 코딩하는 경향이 있습니다. 특정 응용 프로그램이나 이식에 대해 많은 경험이없는 경우 빈과 null을 모두 확인하는 것을 선호합니다. – osij2is

+0

@ osij2is : 코드의 의미를 고려해보십시오. IsNullOrEmpty를 사용하는 경우 참조가 null 인 것으로 때때로 간주되며 참조가 null이 아닌 것으로 간주되는 경우 코드가 혼란 스럽습니다. – Guffa

+6

"실제 코드에서는 결코 발생하지 않습니다"라는 것은 매우 낙관적 인 방법입니다. – peterchen

-5

사람들이 string.Empty를 사용하는 이유에 대해 궁금합니다. 초기화 된 문자열이므로 &이 개념은 .NET 프레임에만 존재합니다.이 문자열은 len이 0 인 유효한 문자열입니다 (db 서버는 매우 명확한 대상을 만듭니다. 이 경우 null을 검사하는 로직이 있지만 빈 문자열을 얻는다면 불평 할 것입니다.) string.IsNullOrEmpty는 내가 본 것 중 상위 5 가지 최악의 관행/기능 중 하나라고 생각합니다. 왜냐하면 어떻게 든 그것을 권장하기 때문에/ok 사람들이 문자열을 초기화하고 을 null로 처리 할 수 ​​있기 때문입니다. 이 함수는 추가 된 적이 없어야하고 .Net 사람들은 그것을 단계적으로 해봐야한다고 생각합니다 :) 어쨌든 누가 빈 문자열을 필요로합니까? 나는 그것을 사용하지 않는 한 그것을 사용한 적이 없다. 기존 프로젝트 때문에 사용하지 않았다면

+0

가능한 경우 사실을 제공하는 것을 고려하십시오. 의견을 말하면 적어도 다른 사람들에게 유용하게 사용할 수있는 근거를 제시하십시오. – IInspectable

1

API에서 인수 검사를 구현할 때, 나는 보통 각 조건을 별도로 검사하고 다른 예외를 throw한다. null 참조 또는 API에 따라 다르다. 사양, ArgumentException 빈 문자열입니다. 이 경우 String.IsNullOrEmpty을 사용하면이 두 가지 개별적인 오류 조건을 구분할 수 없습니다.

if (str == null) 
{ 
    throw new ArgumentNullException("str"); 
} 
if (str == string.Empty) 
{ 
    throw new ArgumentException("The string cannot be empty.", "str"); 
}