C#에서 문자열을 튼튼하게하기 위해 String.Empty 또는 String.Empty.Empty.Empty.Empty를 사용해야합니까?

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

문제

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

어떻게해야합니까? 올바른 방법은 무엇이며 그 이유는 무엇입니까?

string willi = string.Empty;

또는

string willi = String.Empty;

또는

string willi = "";

또는 무엇을?

도움이 되었습니까?

해결책

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

다른 답변은 사용할 때마다 새 문자열이 생성 될 것을 제안했습니다. "". 이것은 사실이 아닙니다. 문자열 인턴으로 인해 어셈블리 당 한 번 또는 AppDomain 당 한 번 (또는 전체 프로세스에 대해서는 한 번만 해당 전면에서 확실하지 않음)가 생성됩니다. 이 차이는 무시할 수 있습니다. 대단히 의미 없는.

그러나 더 읽기 쉬운 것은 다른 문제입니다. 그것은 주관적이며 사람마다 다를 것입니다. 그래서 나는 당신이 당신의 팀의 대부분의 사람들이 좋아하는지 알아 내고 모두 일관성을 위해 그와 함께 갈 것을 제안합니다. 개인적으로 나는 찾는다 "" 읽기 쉽습니다.

그 주장 "" 그리고 " " 서로가 쉽게 오해가 실제로 나와 함께 씻지 않습니다. 비례 글꼴을 사용하지 않는 한 어느 개발자)) 차이점을 말하기가 매우 쉽습니다.

다른 팁

성능 및 코드 생성 관점과는 실제로 차이가 없습니다. 성능 테스트에서, 그들은 하나가 더 빠르고 다른 하나와 밀리 초만 그 사이를왔다 갔다했습니다.

뒤에서 비하인드 코드를 살펴보면 차이도 보이지 않습니다. 유일한 차이점은 IL에 있습니다 string.Empty opcode를 사용하십시오 ldsfld그리고 "" Opcode를 사용합니다 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 

최고의 코드는 코드가 전혀 없습니다:

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

결과적으로 코드가 적은 코드는 더 나은 코드입니다 "" 에게 string.Empty 또는 String.Empty. 그 두 사람은 6 배 더 추가 혜택이 없음 - 정확히 동일한 정보를 표현하기 때문에 명확성이 추가되지 않습니다.

한 가지 차이점은 a를 사용한다는 것입니다 switch-case 구문, 당신은 쓸 수 없습니다 case string.Empty: 일정하지 않기 때문입니다. 당신은 얻는다 Compilation error : A constant value is expected

자세한 내용은이 링크를보십시오.문자열-versus-empty-quotes

나는 선호한다 string 에게 String. 고르는 string.Empty ~ 위에 "" 하나를 선택하고 고수하는 문제입니다. 사용의 장점 string.Empty 당신이 의미하는 바가 매우 분명하고, 당신은 실수로 인쇄 할 수없는 캐릭터를 다음과 같이 복사하지 않습니다. "\x003" 당신의 "".

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

나는 개인적으로 선호합니다 string.Empty. 그것은 개인적인 취향이며, 나는 사례별로 내가 함께 일하는 모든 팀의 의지에 구부립니다.

다른 사람들이 언급했듯이 string.Empty 그리고 String.Empty.

또한, ""를 사용하는 것은 완벽하게 허용됩니다. ""의 모든 인스턴스는 다른 환경에서 객체를 만듭니다. 그러나 .NET은 문자열을 인턴으로 삼으므로 미래의 인스턴스는 인턴 풀에서 동일한 불변의 끈을 가져오고 모든 성능 히트가 무시할 수 있습니다. 원천: 브래드 아브람.

나는 더 복잡한 것에 대한 좋은 이유가 없다면 개인적으로 ""를 선호합니다.

String.Empty 그리고 string.Empty 동등합니다. String BCL 클래스 이름입니다. string C# 별명 (또는 원한 경우 바로 가기)입니다. 동일합니다 Int32 그리고 int. 보다 문서 더 많은 예를 보려면.

"" 걱정됩니다. 정말 확실하지 않습니다.

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

거의 모든 개발자가 ""가 무엇을 의미하는지 알게 될 것입니다. 나는 개인적으로 String을 만났고 처음으로 비어 있고 Google을 검색하는 데 시간을 보내야했는데 ~이다 똑같은 것.

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

사용하는 경우 컴파일러의 동작에 차이가 있습니다. 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

기본적으로, 내가 올바르게 얻는 경우, 프로그래머가 경고 메시지로 그를 방해하지 않고 디버깅 목적으로 함수의 반환 값을 가진 변수를 설정할 수있게하므로 원가당 할당 및 문자열의 경우에만 경고를 제한합니다. 비어있는 것은 일정하지 않고 필드입니다.

콘솔 애플리케이션에서 다음 방법을 사용 하여이 매우 간단한 테스트를 수행했습니다.

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는 아주 멋진 블로그를 가지고 있습니다 여기 이 개념을 설명합니다.

위의 것.

교정 할 수있는 더 많은 것들이 많이 있습니다. 색 나무 껍질이 나무에 가장 적합한 것과 같이, 나는 Dulcet 이끼의 따끔 거림으로 모호한 갈색이라고 생각합니다.

나는 당신이 그것이 무엇인지, 실수로 내용물을 제거하지 않았지만 주로 국제화를위한 것을 알기 위해 다른 이유를 제외하고는 string.empty를 강력히 선호합니다. 인용문에 문자열이 보이면 항상 새로운 코드인지 궁금해야합니다. 문자열 테이블에 넣어야합니다. 따라서 코드가 변경/검토 될 때마다 "인용문"을 찾아야합니다. 그렇습니다. 비어있는 문자열을 필터링 할 수는 있지만 사람들에게 현지화되지 않는다는 것을 알지 않는 한 문자열을 인용하지 않는 것이 좋다고 말합니다. .

string 동의어입니다 System.String 유형, 동일합니다.

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

나는 코드에서 캐릭터 상수 ""를 사용하지 않을 것입니다. string.Empty 또는 String.Empty - 프로그래머가 무엇을 의미하는지 쉽게 볼 수 있습니다.

사이 string 그리고 String 나는 소문자를 좋아한다 string 더 많은 것은 델파이와 함께 몇 년 동안 일했고 델파이 스타일은 소문자입니다. string.

그래서 내가 당신의 상사라면, 당신은 string.Empty

VisualStudio 문자열에서 문자열이 다르게 코딩된다고 언급 한 사람은 없습니다. 가독성에 중요합니다. 또한 소문자는 일반적으로 VAR 및 유형에 사용됩니다. 큰 문제가 아니라 String.ment는 변수이며 Var 또는 유형이 아닙니다.

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

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

추신 : 나는 이런 종류의 "옳은 것"으로 항상 어려움을 겪고 있습니다.

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

정적 메소드, 속성 및 필드에 액세스 할 때 항상 BCL 유형 이름을 사용합니다. String.Empty 또는 Int32.TryParse(...) 또는 Double.Epsilon

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

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

나는 호의적이다 string.Empty ~ 위에 String.Empty 포함하지 않고도 사용할 수 있기 때문입니다. using System; 파일에서.

따기는 "" ~ 위에 string.Empty, 그것은 개인적인 취향이며 팀이 결정해야합니다.

나는 세 번째를 사용하지만 다른 두 가지 중 첫 번째는 덜 이상하게 보입니다. 문자열은 문자열의 별칭이지만 과제를 통해 그것들을 보는 것은 느껴집니다.

처음 두 가지 중 하나는 나에게 받아 들일 수 있습니다. 나는 따옴표 사이에 공간을 넣어 버그를 소개하는 것이 비교적 쉽기 때문에 마지막을 피할 것입니다. 이 특정 버그는 관찰에 의해 찾기가 어렵습니다. 오타가 없다고 가정하면 모두 의미 적으로 동등합니다.

편집하다

또한 항상 사용하고 싶을 수도 있습니다 string 또는 String 일관성을 위해, 그러나 그것은 단지 나입니다.

나는 개인적으로 ""(사소한) 문제가 두 번 발생하는 것을 목격했습니다. 한때 팀 기반 프로그래밍에 새로운 주니어 개발자의 실수로 인한 것이고 다른 하나는 간단한 오타 였지만 사실은 String을 사용하는 것입니다.

그렇습니다. 이것은 매우 판단 전화이지만 언어가 여러 가지 방법을 제공 할 때 가장 많은 컴파일러 감독과 가장 강력한 컴파일 타임 시행을 가진 사람에게 기대하는 경향이 있습니다. 그건 ~ 아니다 "". 그것은 특정한 의도를 표현하는 것입니다.

string.empty 또는 strng.empty를 입력하면 컴파일러가 잘못한 것을 알 수 있습니다. 즉시. 단순히 컴파일하지 않습니다. 개발자로서 당신은 인용하고 있습니다 특정한 컴파일러 (또는 다른 개발자)가 어떤 식 으로든 잘못 해석 할 수 없으며, 잘못 할 때 버그를 만들 수 없습니다.

"" "" "또는 그 반대를 입력하면 컴파일러는 행복하게 말한 것을 행복하게 수행합니다. 다른 개발자는 특정 의도를 수집 할 수도 있고 아닐 수도 있습니다. 생성 된 버그.

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

가능할 때마다 컴파일러가 당신을 위해 일할 수 있도록하고, 아무리 작더라도 인간 오류의 가능성을 제거하십시오. IMO, 이것은 다른 사람들이 인용 한 것처럼 "가독성"을 능가합니다.

특이성 및 컴파일 시간 시행. 저녁 식사입니다.

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

나는 단지 몇 가지 코드를보고 있었고이 질문은 내가 전에 읽은 내 마음에 튀어 나왔습니다. 이것은 확실히 가독성의 문제입니다.

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

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

vs

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

나는 개인적으로 후자가 모호하고 읽기가 더 쉽다는 것을 알게됩니다.

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

내 코드에서 뚜렷하게 노란색으로 채색되기 때문에 "" "어떤 이유로 든 string.empty는 모두 Visual Studio Code 테마에서 흰색입니다. 그리고 나는 그것이 나에게 가장 중요하다고 믿는다.

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

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

다윗에서 알 수 있듯이, 차이가 있습니다 String.Empty 그리고 "" 꽤 작지만 차이가 있습니다. "" 실제로 객체를 생성하면 현악 인턴 풀에서 꺼낼 가능성이 있지만 여전히 ... String.Empty 객체를 생성하지 않습니다 ... 따라서 궁극적으로 메모리 효율을 찾고 있다면 제안합니다. String.Empty. 그러나 차이가 너무 비세하다는 것을 명심해야합니다. 코드에서 결코 볼 수없는 것을 좋아할 것입니다 ...
에 관해서 System.String.Empty 또는 string.Empty 또는 String.Empty... 내 관리 수준은 낮다 ;-)

빈 문자열은 빈 세트와 같습니다. 모두가 전화하는 데 사용하는 이름 만 "". 또한 공식 언어에서는 길이가 0 인 알파벳에서 생성 된 문자열을 빈 문자열이라고합니다. 세트와 문자열 모두 특별한 상징이 있습니다. 빈 문자열 : ε 및 빈 세트 : ∅. 이 Zero Length String에 대해 이야기하고 싶다면 모든 사람들이 당신이 말하는 것을 정확히 알 수 있도록 빈 문자열이라고 부릅니다. 이제 빈 문자열 이름을 사용하는 경우 사용하지 않는 이유 string.Empty 코드에서, 그 의도는 명백하다는 것을 보여줍니다. 단점은 일정하지 않으므로 속성과 같이 어디에서나 사용할 수 없다는 것입니다. (기술적 인 이유는 일정하지 않습니다. 참조 소스를 참조하십시오.)

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

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

2) 문자열과 문자열은 동일하지만 String.Empty (string.format, string.copy 등)를 사용하는 것이 좋습니다. DOT 표기법은 운영자가 아닌 클래스를 나타내며 캐피탈 레터로 시작하는 클래스를 나타내는 것이므로 C# 코딩 표준.

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