C #에서 string.Empty 또는 String.Empty 또는“”를 사용하여 문자열을 초기화해야합니까?


705

C #에서는 빈 문자열로 문자열 값을 초기화하고 싶습니다.

어떻게해야합니까? 올바른 방법은 무엇이며 왜 그렇습니까?

string willi = string.Empty;

또는

string willi = String.Empty;

또는

string willi = "";

또는 무엇을?


7
:이 비슷한 자바에 대한 설명을 참조하십시오 stackoverflow.com/questions/213985/...
하포

39
그래도 String.IsNullOrEmpty (string myString)를 사용하는 것이 더 낫습니까?
ZombieSheep

3
[string.IsNullOrWhiteSpace (stringvalue)]를 사용합니다. .Net 4.0에서 작동합니다. 초기화하려면 다음을 사용하면됩니다. [var text = "";] 단순하고 읽기 쉽고 입력하는 데 가장 시간이 적게 걸립니다 :)
Jalal El-Shaer

61
더 중요한 것은 변수의 재미있는 이름입니다.
Arj

5
나에게 관심이있는 것은 왜 빈 속성이 있는지입니다. 그것은 좋고 모든 것이지만 필수적이고 완전한 것은 아닙니다.
MasterMastic

답변:


807

당신과 당신의 팀이 가장 읽기 쉬운 것을 사용하십시오.

다른 답변에 따르면 사용할 때마다 새 문자열이 생성됩니다 "". 이는 문자열 인터 닝으로 인해 어셈블리 당 한 번 또는 AppDomain 당 한 번 생성되거나 전체 프로세스에 대해 한 번 생성됩니다 (전면에서 확실하지 않음). 대규모, -이 차이는 무시할 대규모 미미.

그러나 더 읽기 쉬운 것은 다른 문제입니다. 주관적이며 개인마다 다르므로 팀의 대부분의 사람들이 좋아하는 것을 찾아 내고 일관성을 유지하기 위해 모든 사람들과 함께하는 것이 좋습니다. 개인적으로 나는 ""더 쉽게 읽을 수 있습니다.

인수 """ "서로 쉽게 착각은 정말 나와 함께 세척하지 않습니다. 당신이 비례 글꼴을 사용하는 (내가 함께 일하지 않는 한 어떤 할 개발자)는 차이를 구별하기 매우 쉽다.


75
""를 예상 할 때 눈이 당신을 속일 수 있습니다. 다른 사람이 작성한 것을 편집하는 것이 더 쉬운 이유입니다. 당신의 두뇌는 텍스트에 대한 선입견을 가지고 있지 않기 때문에 익명을 선택하기가 더 쉽습니다.
tvanfosson

125
@ tvanfosson : 당신 (또는 동료)이 실제로 버그로 물린 적이 있습니까? 나는 실제로 문제를 일으키지 않은 이런 종류의 주장을 의심합니다. 내가 잘못하지 않고 몇 년 동안 ""를 사용했습니다 ...
Jon Skeet

34
개인적으로, 나는 항상 String을 사용했습니다 .Empty, 문자열에서 정적 메소드를 사용하려고 할 때마다 대문자 'S'를 사용합니다. 변수와 유형을 구별 할 수있는 개인적인 선호 일뿐입니다. 그러나 이것은 java의 commons.lang에서 StringUtils.EMPTY를 사용하여 수행 한 것입니다. 한 가지 관심의 대상은 거의 맹인이며 이것은 가독성을 확실히 도와줍니다.
Brett Ryan

79
Times New Roman에서 개발을 시작할 영감을 주셨습니다.
저스틴 Rusbatch

73
일부 모호한 이유로 string.Empty일정하지 않다 . 즉, 컴파일 타임 상수가 필요한 여러 경우에는 string.Empty합법적이지 않습니다. 여기에는 case ""에 블록 switch문장의 기본 값을 선택적 매개 변수 , 매개 변수 및 적용하는 속성 의 속성 , 그리고 (독자에게 왼쪽) 다른 상황을 많이. 따라서 string.Empty일반적인 상황에서는 허용되지 ""않으므로 -everywhere 규칙 을 사용하는 것이 좋습니다 .
Jeppe Stig Nielsen

375

실제로 성능 및 코드 생성 관점과 차이가 없습니다. 성능 테스트에서 이들은 어느 쪽이 더 빠른지 밀리 초 단위로 앞뒤로 이동했습니다.

장면 코드 뒤를 보면 실제로 차이가 보이지 않습니다. 유일한 차이는 IL,에 string.Empty옵 코드를 사용 ldsfld 하고 ""옵 코드를 사용 ldstr,하지만 때문이다 string.Empty정적, 두 명령은 같은 일을한다. 생성 된 어셈블리를 보면 정확히 동일합니다.

C # 코드

private void Test1()
{
    string test1 = string.Empty;    
    string test11 = test1;
}

private void Test2()
{
    string test2 = "";    
    string test22 = test2;
}

IL 코드

.method private hidebysig instance void 
          Test1() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test1,
                [1] string test11)
  IL_0000:  nop
  IL_0001:  ldsfld     string [mscorlib]System.String::Empty
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test1
.method private hidebysig instance void 
        Test2() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] string test2,
                [1] string test22)
  IL_0000:  nop
  IL_0001:  ldstr      ""
  IL_0006:  stloc.0
  IL_0007:  ldloc.0
  IL_0008:  stloc.1
  IL_0009:  ret
} // end of method Form1::Test2

조립 코드

        string test1 = string.Empty;
0000003a  mov         eax,dword ptr ds:[022A102Ch] 
0000003f  mov         dword ptr [ebp-40h],eax 

        string test11 = test1;
00000042  mov         eax,dword ptr [ebp-40h] 
00000045  mov         dword ptr [ebp-44h],eax 
        string test2 = "";
0000003a  mov         eax,dword ptr ds:[022A202Ch] 
00000040  mov         dword ptr [ebp-40h],eax 

        string test22 = test2;
00000043  mov         eax,dword ptr [ebp-40h] 
00000046  mov         dword ptr [ebp-44h],eax 

13
@PrateekSaluja : IL을 보려면 Visual Studio와 함께 제공되는 ildasm.exe를 사용할 수 있습니다. 디 어셈블리를 보려면 중단 점에 도달했을 때 디버그 메뉴의 '디스 셈 블리'창을 사용하십시오 (릴리스 코드에서도 작동).
Thomas Bratt

1
이 제품을 추천하려고하는 것을 싫어하십시오 .. .. 리플렉터를 사용하면 소스를 분해 할 때 언어를 선택할 수 있습니다. IL은 옵션입니다! ILDASM은 방금 낡은 느낌입니다 ... MS 툴 팀은 좋은 툴을 연마하거나 출시하지 않는 것 같습니다!
felickz

80

가장 좋은 코드는 전혀 코드가 아닙니다 .

코딩의 기본 특성은 프로그래머로서 우리가하는 모든 결정은 트레이드 오프임을 인식하는 것입니다. […] 간결하게 시작하십시오. 테스트에 필요한 다른 치수를 늘리십시오.

결과적으로, 적은 코드는 더 나은 코드는 다음과 같습니다 안함 ""으로 string.EmptyString.Empty. 이 두 가지는 6 배 더 길며 추가 혜택이 없습니다. 정확히 동일한 정보를 표현하기 때문에 명확성이 추가되지 않았습니다.


1
하지만 C #으로 우리는 단지 string.IsNullOrWhitespace (들)을 말할 수있다 : P
felickz

31
나는 코드가 가능한 한 작아야한다는 데 동의하지만 일반적으로 적은 문자가 항상 더 나은 코드라고 주장하지는 않습니다. 예를 들어 변수 이름 지정과 관련하여 합리적인 양의 문자는 일반적으로 i와 j를 사용하는 것보다 이름이 더 좋습니다.
Markus Meyer

3
즉, 고도로 따라 @Markus : 인덱스를 나타내는 루프 변수, i 이다 긴 변수 이름보다 더. 동일한 정보를 전달하는 보다 일반적이고 짧은 변수 이름 이 항상 더 명확해야합니다. 필요한 정보를 표현하기 위해서는 특정 문자 길이 가 필요 하며 이것을 거부하지는 않습니다 (아무도 없습니다).
Konrad Rudolph

2
@ Konrad : 루프가 작고 다른 인덱스를 포함하지 않는 경우에만 좋은 변수 이름입니다. 그러나 나는 sth라면 동의합니다. 문자열과 같이 선호하는 동일한 정보를 더 간단히 전달할 수 있습니다. string.Empty는 명확성을 추가하지 않습니다.
Markus Meyer

나에게 : string.Empty는이 문자열이 항상 비어 있어야한다고 말하지만 ""는이 문자열을 작성할 때 비어있을 수 있지만 자유롭게 변경할 수 있다고 말합니다.
aeroson

54

한 가지 차이점은 switch-case구문 을 사용 case string.Empty:하면 상수가 아니기 때문에 작성할 수 없다는 것입니다. 당신은 얻을Compilation error : A constant value is expected

자세한 내용은이 링크를 참조하십시오 : string-empty-versus-empty-quotes


22
switch진술은 아주 좋은 예입니다. 또한와 같은 선택적 매개 변수를 만들면 void MyMethod(string optional = "") { ... }을 (를) 사용할 수 없습니다 string.Empty. 물론 const필드 또는 로컬 변수 를 정의 const string myString = "";하려면 다시 ""유일한 옵션입니다. string.Empty필드가 일정 하다면 차이가 없을 것입니다. 그러나 그렇지 않은 경우도 있으므로을 사용해야 ""합니다. 왜 ""항상 사용하지 않습니까?
Jeppe Stig Nielsen

5
를 사용 string.Empty하면 코드 기반에서 일관성 을 얻을 수 없으므로 매우 강력한 주장 입니다. 동일한 것을 표현하려면 서로 다른 두 엔티티를 사용해야합니다. 그리고 당신이 할 수없는 일 목록에 추가하려면 : 속성string.Empty 과 함께 사용할 수 없습니다 .
Pragmateek

2
아주 좋은 포인트! 링크가 끊어졌습니다. 여기에 콘텐츠의 복사본입니다 : web.archive.org/web/20131230161806/http://kossovsky.net/...
ygoe의

42

선호 string합니다 String. 선택 string.Empty이상은 ""하나를 선택하고 그것으로 튀어 나와의 문제이다. 사용의 장점은 string.Empty당신이 무엇을 의미하는지 아주 분명하다, 당신은 실수로 같은 이상 인쇄 할 수없는 문자를 복사하지 마십시오 "\x003"당신의에서 "".


101
실수로 인쇄 할 수없는 문자를 코드에 복사하는 경우이 질문보다 더 큰 문제가 있습니다.)
Jon Skeet

9
ASCII \ 003은 다음과 같이 작업 한 B2B 메시지의 필드 구분 기호입니다.
Jimmy

7
(- 그것은 "\ x9Bad 컴파일러"사이의 차이를 발견하기가 너무 어렵다 및이 "\ x9Good 컴파일러"나는 또한 BTW는 \ X 탈출을 피하는 게 좋을 것 근본적으로 다른 결과를!)
존 소총

개인적으로 String에서 정적 메서드를 호출 할 때마다 String보다 String을 선호합니다. 그러나 나는 거의 장님이고 이것은 내가 누구에게도 강요하지 않는 개인적인 취향입니다.
Brett Ryan

2
@Jimmy Sure, 그러나 우리는 빈 문자열에 대해 이야기하고있었습니다. ""복사 / 붙여 넣기시 위험한 인수 는 무효입니다. 빈 문자열을 복사 / 붙여 넣지 않기 때문입니다. 다른 줄의 경우에는 항상 염두에 두어야합니다.
Timo

22

나는 차임하지 않을 것이지만 여기에 잘못된 정보가 던져지는 것을보고 있습니다.

개인적으로 선호합니다 string.Empty. 그것은 개인적인 취향이며, 나는 함께 일하는 모든 팀의 의지에 구애받습니다.

다른 사람들이 언급했듯이 string.Empty와 사이에는 전혀 차이가 없습니다 String.Empty.

또한 이것은 ""를 사용하는 것이 완벽하게 허용되는 약간의 사실입니다. ""의 모든 인스턴스는 다른 환경에서 객체를 생성합니다. 그러나 .NET은 문자열을 인턴하므로 향후 인스턴스는 인턴 풀에서 동일한 불변 문자열을 가져 오므로 성능 저하는 무시할 수 있습니다. 출처 : Brad Abrams .


20
""기술적으로 "" "의 모든 인스턴스가 개체를 만드는 이유를 모르겠습니다. 문자열이 삽입 될 가능성은 없으며 C # 사양에 있습니다.
Jon Skeet

15

좀 더 복잡한 이유가없는 한 개인적으로 ""를 선호합니다.


13

String.Empty그리고 string.Empty동등합니다. StringBCL 클래스 이름입니다. stringC # 별칭입니다 (또는 원하는 경우 바로 가기). with Int32와 동일합니다 int. 더 많은 예제 는 문서 를 참조하십시오 .

지금까지처럼 ""관한 한, 난 정말 모르겠어요.

개인적으로 나는 항상을 사용 string.Empty합니다.


10

거의 모든 개발자가 ""의 의미를 알 수 있습니다. 나는 개인적으로 String.Empty로를 처음 발견하고 정말 있는지 알아 내기 위해 약간의 시간 검색 구글을 지출했다 입니다 똑같은.


3
공개 읽기 전용 문자열 필드이며 값은 ""입니다. 왜 변경됩니까?
Matthew Whited

5
@Jason이하는 요점을 놓칩니다. 처음 본 것이 무엇인지 어떻게 알 수 string.Empty있습니까? ""처음 본 것이 무엇인지 아십니까 ?
David R Tribble

10

이 주제는 꽤 오래되고 길기 때문에이 행동이 다른 곳에서 언급 된 경우 실례합니다. (그리고 이것을 다루는 대답을 알려주세요)

string.Empty따옴표 를 사용 하거나 큰 따옴표로 묶으 면 컴파일러의 동작에 차이가 있습니다 . string.Empty 또는 큰 따옴표로 초기화 된 문자열 변수를 사용하지 않으면 차이점이 표시됩니다.

string.Empty컴파일러 경고 로 초기화하는 경우

CS0219 - The variable 'x' is assigned but its value is never used

큰 따옴표로 초기화하는 경우 예상 메시지가 표시되는 동안 절대로 방출되지 않습니다.

이 동작은이 링크의 연결 문서에 설명되어 있습니다. https://connect.microsoft.com/VisualStudio/feedback/details/799810/c-warning-cs0219-not-reported-when-assign-non-constant-value

기본적으로, 내가 올바르게 이해하면 프로그래머가 경고 메시지로 귀찮게하지 않고 디버깅 목적으로 함수의 반환 값으로 변수를 설정하여 비용 할당 및 문자열의 경우에만 경고를 제한하려고합니다. 공란은 상수가 아니라 필드입니다.


1
나는 당신이 언급 한 첫 번째 사람이라고 믿습니다. 몇 달 전에이 Q & A를 읽었으며이 차이점을 기억하지 못합니다.
Palec

2
흥미 롭군 var unused = "literal";컴파일러 는 선언 을 완전히 최적화 (제거) 할 수 있습니다. 부작용이 없습니다. 반면에 var unused = MyClass.Member;완전히 제거 할 수는 없습니다. 독서 Member가 부작용을 일으킬 수 있기 때문 입니다. 접근자가 Member있는 정적 속성 인 경우 getgetter에 대한 호출을 유지해야합니다. 그러나 Member정적 필드 인 경우에도 정적 생성자가 실행할 수있는 부작용이있을 수 있습니다. 물론 그렇게하는 것은 나쁜 코딩 스타일 일 것입니다. 그러나 당신은 읽을 더미가 필요합니다 Member.
Jeppe Stig Nielsen 님이

9

콘솔 응용 프로그램에서 다음 방법을 사용하여 매우 간단한 테스트를 수행했습니다.

private static void CompareStringConstants()
{
    string str1 = "";
    string str2 = string.Empty;
    string str3 = String.Empty;
    Console.WriteLine(object.ReferenceEquals(str1, str2)); //prints True
    Console.WriteLine(object.ReferenceEquals(str2, str3)); //prints True
}

이 명확하게, 즉 세 가지 변수 제안 str1, str2그리고 str3다른 구문을 사용하여 초기화되고 있지만 메모리에 객체 (제로 길이) 정확히 동일한 문자열을 가리키고있다. .NET 4.5 콘솔 응용 프로그램에서이 테스트를 수행했습니다. 내부적으로는 차이가 없으며 프로그래머로 사용하려는 편의성으로 요약됩니다. 문자열 클래스의 이러한 동작을 .NET에서 문자열 인턴 이라고 합니다 . Eric Lippert는 이 개념을 설명 하는 아주 멋진 블로그를 가지고 있습니다 .


8

위의 모든 것.

교제해야 할 더 많은 것들이 많이 있습니다. 나무 껍질이 나무에 가장 잘 맞는 것과 같은, 나는 dulcet moss의 색조로 모호한 갈색이라고 생각합니다.


7

String.Empty를 강력하게 선호합니다. 다른 이유와는 별도로, 내용을 실수로 제거하지 않았지만 주로 국제화를 목적으로한다는 사실을 알 수 있습니다. 따옴표로 묶인 문자열을 보면 항상 새 코드인지 궁금해하고 문자열 테이블에 넣어야합니다. 따라서 코드가 변경 / 검토 될 때마다 "따옴표로 된 것"을 찾아야합니다. 네, 빈 문자열을 걸러 낼 수 있지만 지역화되지 않는다는 것을 알지 않는 한 문자열을 따옴표로 묶지 않는 것이 좋습니다. .


7

VisualStudio에서 String은 string과 다르게 색상이 코딩되었다고 언급 한 사람은 없습니다. 가독성에 중요합니다. 또한 소문자는 일반적으로 vars 및 type에 사용되며 큰 것이 아니라 String입니다 .Empty는 상수이며 var 또는 type이 아닙니다.


String.Empty는 상수가 아닙니다 : stackoverflow.com/questions/507923/… 이것은 실제로 설계 상으로는 String 클래스의 인스턴스입니다. 그리고 약간은 숨겨져 있지만 채색은 언급되었습니다 : stackoverflow.com/questions/263191/…
Michael

6

stringSystem.String유형과 동의어 이며 동일합니다.

값도 동일합니다. string.Empty == String.Empty == ""

차라리, 코드 ","문자 상수를 사용하지 않을 string.Empty또는 String.Empty- 쉽게 프로그래머가 무엇을 의미하는지 볼 수 있습니다.

사이 stringStringI 낮은 경우처럼 string나는 년간 많은 델파이와 함께 작업에 사용 델파이 스타일이 소문자 더해서 string.

내가 당신의 상사라면 string.Empty


6

내가 선호하는 것 string.Empty이상 String.Empty당신이를 포함 할 필요없이 사용할 수 있기 때문에 using System;파일에.

""인수 선택 string.Empty은 개인 취향이며 팀이 결정해야합니다.


2
나는 팀의 유일한 멤버입니다. 어떻게 결정합니까? 주사위를 던져?
Gqqnbig

1
네임 스페이스 string.Empty를 가져 오지 않고 상수 를 사용하는 방법에 대해 궁금해하는 사람들을 위해 using SystemC #의 키워드는 네임 스페이스가 포함 된 정규화 된 이름으로 변환되어 출력 * .dll 또는 *에 MSIL로 작성 되기만하면됩니다. exe 파일. 따라서 컴파일러가 MSIL string.Empty과 같이 효과적으로 작성 System.String.Empty합니다. 그리고 이미 알고 있듯이 정규화 된 유형 이름을 언급하면 ​​코드 파일 맨 위에 네임 스페이스 가져 오기를 건너 뛸 수 있습니다.
RBT

5

나는 차이를 만들지 않습니다. 마지막은 입력하는 것이 가장 빠릅니다 :)


4

중요하지 않습니다-그들은 정확히 같은 것입니다. 그러나 가장 중요한 것은 일관성있어야 한다는 것입니다

추신 : 나는 항상 이런 종류의 "옳은 일"로 고생합니다.


1
현대 세계에서 "일관된"이란 전세계 모든 팀에서 일관성을 유지하는 것을 의미하며 이는 StackOverflow의 목표 중 하나입니다. 제안 할 수 있다면 String.Empty를 사용하십시오.
Pavel Radzivilovsky

1
일부 언어에는 빈 상수가 없으며, 내가 생각할 수있는 모든 언어는 ""길이가 0 인 문자열을 허용합니다. 다른 언어와의 일관성을 위해 ""에 투표합니다. :)
TomXP411

4

.NET이 문자열을 처리하는 방식과 관련하여 완전히 코드 스타일 환경 설정입니다. 그러나 여기에 내 의견이 있습니다 :)

정적 메서드, 속성 및 필드를 액세스 할 때 난 항상 BCL 유형 이름을 사용 String.Empty하거나 Int32.TryParse(...)또는Double.Epsilon

새 인스턴스를 선언 할 때는 항상 C # 키워드를 사용합니다. int i = 0;또는string foo = "bar";

코드를 스캔하여 재사용 가능한 명명 된 상수로 결합 할 수 있기 때문에 선언되지 않은 문자열 리터럴을 거의 사용하지 않습니다. 컴파일러는 어쨌든 상수를 리터럴로 대체하므로 마술 문자열 / 숫자를 피하고 이름으로 조금 더 의미를 부여하는 더 많은 방법입니다. 또한 값을 변경하는 것이 더 쉽습니다.


3

나는 세 번째를 사용하지만 다른 두 개 중 첫 번째는 덜 이상하게 보입니다. 문자열은 문자열의 별명이지만, 할당을 통해 보는 것은 기분이 좋지 않습니다.


3

처음 두 가지 중 하나가 허용됩니다. 따옴표 사이에 공백을 두어 버그를 도입하는 것이 상대적으로 쉽기 때문에 마지막 것을 피할 것입니다. 이 특정 버그는 관찰하기가 어렵습니다. 오타가 없다고 가정하면 모두 의미 상 동등합니다.

[편집하다]

또한 항상 string또는 String일관성을 위해 사용하고 싶을 수도 있지만 그저 나뿐입니다.


나는이 발언에 동의하지만 게으 르면 여전히 위험하게 살고 있습니다. 어쨌든 변수 선언 외부에 문자열을 할당하기 전에 문자열을 사용하는 코드를 작성할 기회가 없다고 생각합니다. 실제로 위험에도 불구하고 문자열을 초기화해야한다는 것은 나에게 성가신 일입니다.
EnocNRoll-AnandaGopal Pardue

3

나는 ""를 개인적으로 목격하여 (사소한) 문제가 두 번 발생했습니다. 한 번은 팀 기반 프로그래밍에 익숙하지 않은 주니어 개발자의 실수로 인한 것이었고, 다른 하나는 단순한 오타 였지만 사실은 문자열을 사용하고 있습니다.

그렇습니다. 이것은 많은 판단을 요구하지만 언어가 여러 가지 방법으로 작업을 수행 할 때 컴파일러 감독과 컴파일 시간이 가장 강한 언어에 의존하는 경향이 있습니다. "" 가 아닙니다 . 그것은 특정한 의도를 표현하는 것입니다.

string.EMpty 또는 Strng.Empty를 입력하면 컴파일러에서 잘못했다고 알려줍니다. 바로. 단순히 컴파일되지 않습니다. 개발자 는 컴파일러 (또는 다른 개발자)가 어떤 식 으로든 잘못 해석 할 수 없다는 특정 의도를 인용 하고 있으며 잘못하면 버그를 만들 수 없습니다.

""를 의미 할 때 ""를 입력하거나 그 반대의 경우, 컴파일러는 사용자가 지시 한대로 행복하게 수행합니다. 다른 개발자가 특정 의도를 모을 수도 있고 얻지 못할 수도 있습니다. 버그가 생성되었습니다.

string.Empty 이전에는 EMPTY_STRING 상수를 정의한 표준 라이브러리를 사용했습니다. string.Empty가 허용되지 않는 경우에는 여전히 상수를 사용합니다.

가능할 때마다 컴파일러를 사용하여 작게 만들더라도 사람이 실수 할 가능성을 제거하십시오. IMO는 다른 사람들이 언급 한 것처럼 "가독성"보다 우월합니다.

특이성과 컴파일 시간 시행. 저녁 식사를 위해 무엇입니까.


3

""는 코드에서 뚜렷하게 노란색으로 표시되기 때문에 ""를 사용합니다. 어떤 이유로 String.Empty는 Visual Studio Code 테마에서 모두 흰색입니다. 그리고 나는 그것이 가장 중요하다고 생각합니다.


2

컴파일러는 장기적으로 모두 동일하게 만들어야합니다. 코드를 쉽게 읽을 수 있도록 표준을 선택하고 준수하십시오.


2

방금 몇 가지 코드를보고 있었고이 질문은 이전에 읽었던 내 마음에 나타납니다. 이것은 확실히 가독성의 문제입니다.

다음 C # 코드를 고려하십시오 ...

(customer == null) ? "" : customer.Name

vs

(customer == null) ? string.empty : customer.Name

나는 개인적으로 후자가 덜 모호하고 읽기 쉽다는 것을 알았습니다.

다른 사람들이 지적했듯이 실제 차이점은 무시할 수 있습니다.


1

나는 두 번째가 "적절한 것"이라고 생각하지만 솔직히 말해서 그것이 중요하지 않다고 생각합니다. 컴파일러는 동일한 바이트 코드로 컴파일 할 수있을 정도로 똑똑해야합니다. ""를 직접 사용합니다.


1

차이는 매우 적지 만 그 차이는 여전히 존재합니다.

1) ""는 String.Empty가 아닌 객체를 생성합니다. 그러나이 객체는 한 번 생성되며 코드에 다른 ""가 있으면 나중에 문자열 풀에서 참조됩니다.

2) 문자열과 문자열은 동일하지만 도트 표기법은 연산자가 아닌 클래스를 나타내며 대문자로 시작하는 클래스는 다음을 준수하므로 String.Empty (String.Format, String.Copy 등)를 사용하는 것이 좋습니다. C # 코딩 표준


1
String.Empty로는 이다 , 소스 확인 ""
dss539

1

http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx :

데이비드에서 알 수 있듯이, 이들 사이의 차이 String.Empty와는 ""아주 작은하지만 차이가있다. ""실제로 객체를 생성하면 문자열 인턴 풀에서 꺼내 질 가능성이 있지만 여전히 ... String.Empty객체 를 생성하지 않는 동안 ... 궁극적으로 메모리 효율성을 찾고 있다면 제안 String.Empty합니다. 그러나 차이가 그래서 ... 당신은 당신의 코드에서 볼 수 없을 좋아합니다 trival 염두에 두어야 할
뿐만를 System.String.Empty하거나 string.Empty또는 String.Empty;-) ... 내 의료 수준이 낮은


1
MSDN 블로그 게시물은 2003 년에 게시 된 것입니다. 이것이 최신 .NET 버전에도 여전히 적용됩니까?
Carsten Schütte

@ CarstenSchütte : 그러한 기능은 크게 바뀌지 않는 것 같습니다 ... 그렇다면 인터넷에 약간의 윙윙 거리는 소리가 들렸습니다.
sergiol

3
@sergiol 필드가 리터럴보다 더 효율적인 경우 이것은 명백한 성능 버그입니다. 그래서 지금까지 고쳐지기를 바라고 있습니다.
Konrad Rudolph

1

빈 문자열은 모두가 호출하는 데 사용하는 이름과 같은 빈 집합과 같습니다 "". 또한 공식 언어에서는 길이가 0 인 알파벳으로 만든 문자열을 빈 문자열이라고합니다. 세트와 문자열에는 특별한 기호가 있습니다. 빈 문자열 : ε 및 빈 세트 : ∅. 이 길이가 0 인 문자열에 대해 이야기하려면 빈 문자열이라고 부르므로 모든 사람이 당신이 참조하는 것을 정확하게 알 수 있습니다. 이제 string.Empty코드에서 사용하지 않는 빈 문자열의 이름을 지정 하면 의도가 명시 적입니다. 단점은 상수가 아니므로 속성과 같이 어디에서나 사용할 수 없다는 것입니다. (기술적 인 이유로 일정하지 않습니다. 참조 소스를 참조하십시오.)


0

나는 ""더 짧고 String.Empty존재하지 않는 문제를 해결 하기 때문에 선호 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.