string.Empty vs null. 어떤 것을 사용합니까?


84

최근 직장 동료 string.Empty가 문자열 변수를 설정할 때 사용하지 말고 null스택을 오염 시키므로 사용 하라고 말했습니다 .

그는하지 말라고

string myString=string.Empty; 하지만 string mystring=null;

정말 중요합니까? 나는 문자열이 객체라는 것을 알고 있으므로 일종의 의미가 있습니다.

나는 어리석은 질문이라는 것을 알고 있지만 당신의 견해는 무엇입니까?


1
왜 당신이 그렇게하는지 잘 모르겠습니다 ... 당신이 예제로 논의했던 코드를 조금 더 줄 수 있습니까?
stusmith

코드가 없습니다. 동료에게 디버깅중인 것을 보도록 요청했고 그는 일반적인 규칙으로 "not use string.empty"를 스택에있을 때 null로 설정한다고 말했습니다. 개인적으로 저는 항상 string.Empty를 사용했습니다. 나왔을 때는 ""보다는 사용하는 것이 옳다고 생각했기 때문입니다.
user712923


내 말은 ... string.Empty,, ""그리고 null모두 상수 값이지만 변수에 할당하는 이유를 알 수 없을만큼 모두 '단순'합니다. out변수 를 캡처해야하는 경우 왜 string myString;?
stusmith

8
요즘에는 가독성과 의미론에 초점을 맞추지 않고 터무니없는 마이크로 최적화에 초점을 맞춘 이와 같은 주제에 대한 주장은 기껏해야 약합니다. 주어진 상황에 맞는 것을 의미하는 것을 사용하십시오. (예를 들어, 누군가가 중간 이름을 가지고 있지 않다는 것을 안다면, 당신은 사용합니다 String.Empty; 누군가 당신이 사용하는 중간 이름을 가지고 있는지 여부를 모른다면 null). 그런 다음 올바른 의미를 가지면 명확하게 정확하고 쉽게 유지 관리 할 수있는 방식으로 코드를 작성하십시오.
jason jul.

답변:


110

nullEmpty매우 다른, 그리고 그들 사이를 전환 임의적으로하지 않는 것이 좋습니다. 그러나 Empty하나의 고정 된 참조 이므로 추가 "비용" 이 없습니다 (여러 번 사용할 수 있음).

ldsfld로 인한 스택에는 "오염"이 없습니다 . 그 우려는… 로드하는 null것은 다소 저렴하지만 값 확인에주의하지 않으면 널 참조 예외가 발생할 수 있습니다.

개인적으로는 둘 다 사용하지 않습니다 ... 빈 문자열을 원한다면 ""간단하고 분명합니다. 수단을 인턴이 또한 어떤 당 사용 오버 헤드를 가지고있다.


IL 수준에서 ""와 Empty의 차이점은 ldstr과 ldsfld에 불과하지만 둘 다 동일한 단일 인턴 문자열 참조를 제공합니다. 또한 최신 .NET 버전에서는 JIT가 직접 차단하여 빈 문자열 참조를 생성합니다. 실제로 정적 필드 조회를 수행 하지 않고 . 기본적으로 가독성을 제외하고는 어느 쪽이든 신경을 쓸 이유가 없습니다. ""만 사용합니다.


5
@ user712923 그가 구체적인 우려 사항을 가지고 돌아 오면 듣고 싶습니다
Marc Gravell

4
@Marc : ASAIK "는"String.Empty로가 아닌 오브젝트를 생성 .. 확인 . 그것은 문자열 인턴 풀과 관련이 있습니다 ....
Jalal Said


1
""6 배 더 긴 상용구 코드 대신 사용하면 +1 . 누가이 말도 안 돼?! @Jalal 그 Brad Abrams 게시는 심각하게 구식이며 컴파일러가 여전히 두 코드를 똑같이 최적화하지 않으면 Microsoft에 부끄럽습니다 ! 그러나 그들의 일을 고치는 것은 우리의 일이 아닙니다. 그리고 사실, 우리는 그럴 필요가 없습니다. 두 번째 링크에서 Lasse (주석에있는)는 두 변형과 비교 한 어셈블리 출력을 비교했습니다. 둘은 동일합니다.
Konrad Rudolph

1
@Konrad : 한 가지 예는 상수 문자열을 연결할 때 일어나는 일입니다. 문자열 클래스는 인턴 풀을 사용하므로 새 문자열을 만들 때 클래스는 문자열이 이미 풀에 있는지 확인한 다음 풀에 추가하지 않았는지 확인합니다. 그 때문에 ""전체 풀을 검색하여 이미 있는지 여부를 확인하고 string.Empty;사용하는 경우 미리 정의 된 값을 사용하고 검색이 더 이상 존재하지 않는 방식입니다. 클래스는 또한이 메서드를 노출했습니다 : 이것을string.Intern/IsInterned 확인 하십시오
Jalal Said

34

그것은 '스택을 오염시키지'않습니다. 기술적 이유는 없지만 변수를 객체에 대한 참조로 설정하는 것 (빈 문자열이더라도)과 null. 그것들은 같은 것이 아니며 다른 방식으로 사용되어야합니다.

null데이터가 없음을 나타 내기 위해 string.Empty(또는 "") 데이터가 있음을 나타 내기 위해 사용되어야합니다 ( 실제로는 일부 빈 텍스트). 가장 적절한 것이 무엇인지 확실하지 않은 특별한 경우가 있습니까?

편집, 추가 된 예 :

  • string.Empty사람 이름의 기본 접미사로 사용할 수 있습니다 (예를 들어 대부분의 사람들은 박사 학위가 없습니다).

  • null구성 파일에 지정되지 않은 구성 옵션에 사용할 수 있습니다 . 이 경우 string.Empty구성 옵션이 있지만 원하는 구성 값이 빈 문자열 인 경우 사용됩니다.


내가 방금 말한 admit.Given에있는 당신이 본보기 ... 당신의 설명은 여전히 자기 설명 있지만 감사를 알고 나에게주고 마음을 어떻게, 그런 식으로 생각하지 않았다
user712923

2
글쎄, 둘 중 하나를 선택하는 유일한 이유는 당신이 그것을 사용할 장소에 따라 다릅니다. 즉 , 빈 문자열을 사용하고 데이터가 없음을 나타내 려는 경우 string.Empty또는 ""사용하십시오 null. string.Empty사람의 이름 (예 : 대부분의 사람은 PhD가 없음) 및 null구성 파일에 지정되지 않은 구성 옵션에 대한 기본 접미사로 사용할 수 있습니다 . 두 번째 경우 string.Empty에는 구성 옵션이 있지만 원하는 구성 값이 빈 문자열 인 경우 사용됩니다.
Kieren Johnstone

@Kieren Johnstone, 접미사 이름이없는 경우 null"접미사 없음"을 표시 하는 데 사용하지 않는 이유는 무엇입니까?
OfirD

8

다른 사람들이 이미 대답했듯이 그들은 다릅니다.

static void Main(string[] args)
{
    string s1 = null;
    string s2 = string.Empty;
    string s3 = "";
    Console.WriteLine(s1 == s2);
    Console.WriteLine(s1 == s3);
    Console.WriteLine(s2 == s3);
}

 results:
 false     - since null is different from string.empty
 false     - since null is different from ""
 true      - since "" is same as string.empty

빈 문자열과 null 문자열을 관리하는 문제는 플랫 파일로 유지하거나 통신을 통해 전송해야 할 때 문제가되고 있습니다. 따라서이 페이지를 방문하여 좋은 솔루션을 제공하는 다른 사용자에게 유용 할 수 있습니다. 그 특별한 문제.

문자열을 파일이나 통신에 저장
하려면 문자열을 바이트로 변환해야 할 것입니다.
내가 권장하는 좋은 방법은 변환 된 문자열에 2 개의 헤더 바이트 세그먼트를 추가하는 것입니다.

세그먼트 1-1 바이트에 저장되고 다음 세그먼트의 길이를 설명하는 메타 정보.

세그먼트 2-저장할 문자열의 길이를 보유합니다.

예 :
문자열 "abcd"-단순화하기 위해 ASCII 인코더를 사용하여 변환하고 {65,66,67,68}을 얻습니다.
계산 세그먼트 2는 4를 산출하므로 4 바이트는 변환 된 문자열의 길이입니다.
세그먼트 1을 계산하면 1이 생성됩니다. 변환 된 문자열 정보의 길이 정보를 보유하는 데 1 바이트 만 사용되었으므로 (즉, 260이면 2를 얻습니다)

새 바이트 스트라이프는 이제 파일에 저장할 수있는 {1,4,65,66,67,68}이됩니다.

주제와 관련된 이점은 저장할 빈 문자열이 있으면 변환에서 길이가 0 인 빈 바이트 배열을 얻고 세그먼트를 계산 한 후 결국 {1,0}이 될 수 있다는 것입니다. 저장되고 나중에로드되고 빈 문자열로 다시 해석됩니다. 반면에 문자열에 null 값이 있으면 저장할 바이트 배열로 {0} 만 갖게되며로드 될 때 다시 null로 해석 될 수 있습니다.

여러 문자열을 재그 (jag)하는 경우로드하거나 누적 할 크기를 아는 것과 같은 더 많은 이점이 있습니다.

주제로 돌아가서-그것은 .. 설명 된 동일한 원칙이 null과 빈을 구별하기 위해 모든 시스템에서 사용되는 것과 같이 스택을 오염시킬 것입니다. 그래서 yes string.Empty는 null보다 더 많은 메모리를 차지합니다. 오염이라고 .. 1 바이트 만 더.


1

죽음에 대한 응답을 받았지만 null은 초기화되지 않은 값이 없음을 의미합니다. string.Empty는 MSDN에 명시된대로 ""(빈 문자열)을 의미합니다.

비어 있거나 null 문자열을 확인하는 가장 안전한 방법은 string.IsNullOrEmpty를 사용하는 것입니다.


-2

FWIW, 내가 혼합 것을 발견 ""하고하는 것은 String.Empty작동하지 않습니다

var a = "";
alert("a " + (a == "") + ", " + (a==String.Empty));   //Yields "a true, false"

var b = String.Empty;
alert("b " + (b == "") + ", " + (b == String.Empty)); //Yields "b false, true"

특히을 사용 $.trim하여 빈 DOM 입력 필드의 값을 얻은 다음이를와 비교 String.Empty하면 false. 그 이유는 확실하지 않지만 거기에 있습니다. 이제 ""일관성을 위해 모든 곳에서 사용 합니다.


1
예. 이것이 우리 모두가 확인 .Length==0하거나 사용 하는 습관을 유지해야하는 이유입니다.Compare()
zanlok

14
이 질문은 C #을하지 JS에 대해 묻습니다
콜 존슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.