C #에서는 빈 문자열로 문자열 값을 초기화하고 싶습니다.
어떻게해야합니까? 올바른 방법은 무엇이며 왜 그렇습니까?
string willi = string.Empty;
또는
string willi = String.Empty;
또는
string willi = "";
또는 무엇을?
C #에서는 빈 문자열로 문자열 값을 초기화하고 싶습니다.
어떻게해야합니까? 올바른 방법은 무엇이며 왜 그렇습니까?
string willi = string.Empty;
또는
string willi = String.Empty;
또는
string willi = "";
또는 무엇을?
답변:
당신과 당신의 팀이 가장 읽기 쉬운 것을 사용하십시오.
다른 답변에 따르면 사용할 때마다 새 문자열이 생성됩니다 ""
. 이는 문자열 인터 닝으로 인해 어셈블리 당 한 번 또는 AppDomain 당 한 번 생성되거나 전체 프로세스에 대해 한 번 생성됩니다 (전면에서 확실하지 않음). 대규모, -이 차이는 무시할 대규모 미미.
그러나 더 읽기 쉬운 것은 다른 문제입니다. 주관적이며 개인마다 다르므로 팀의 대부분의 사람들이 좋아하는 것을 찾아 내고 일관성을 유지하기 위해 모든 사람들과 함께하는 것이 좋습니다. 개인적으로 나는 ""
더 쉽게 읽을 수 있습니다.
인수 ""
와 " "
서로 쉽게 착각은 정말 나와 함께 세척하지 않습니다. 당신이 비례 글꼴을 사용하는 (내가 함께 일하지 않는 한 어떤 할 개발자)는 차이를 구별하기 매우 쉽다.
string.Empty
일정하지 않다 . 즉, 컴파일 타임 상수가 필요한 여러 경우에는 string.Empty
합법적이지 않습니다. 여기에는 case ""
에 블록 switch
문장의 기본 값을 선택적 매개 변수 , 매개 변수 및 적용하는 속성 의 속성 , 그리고 (독자에게 왼쪽) 다른 상황을 많이. 따라서 string.Empty
일반적인 상황에서는 허용되지 ""
않으므로 -everywhere 규칙 을 사용하는 것이 좋습니다 .
실제로 성능 및 코드 생성 관점과 차이가 없습니다. 성능 테스트에서 이들은 어느 쪽이 더 빠른지 밀리 초 단위로 앞뒤로 이동했습니다.
장면 코드 뒤를 보면 실제로 차이가 보이지 않습니다. 유일한 차이는 IL,에 string.Empty
옵 코드를 사용 ldsfld
하고 ""
옵 코드를 사용 ldstr
,하지만 때문이다 string.Empty
정적, 두 명령은 같은 일을한다. 생성 된 어셈블리를 보면 정확히 동일합니다.
private void Test1()
{
string test1 = string.Empty;
string test11 = test1;
}
private void Test2()
{
string test2 = "";
string test22 = test2;
}
.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 배 더 길며 추가 혜택이 없습니다. 정확히 동일한 정보를 표현하기 때문에 명확성이 추가되지 않았습니다.
i
이다 긴 변수 이름보다 더. 동일한 정보를 전달하는 보다 일반적이고 짧은 변수 이름 이 항상 더 명확해야합니다. 필요한 정보를 표현하기 위해서는 특정 문자 길이 가 필요 하며 이것을 거부하지는 않습니다 (아무도 없습니다).
한 가지 차이점은 switch-case
구문 을 사용 case string.Empty:
하면 상수가 아니기 때문에 작성할 수 없다는 것입니다. 당신은 얻을Compilation error : A constant value is expected
자세한 내용은이 링크를 참조하십시오 : string-empty-versus-empty-quotes
switch
진술은 아주 좋은 예입니다. 또한와 같은 선택적 매개 변수를 만들면 void MyMethod(string optional = "") { ... }
을 (를) 사용할 수 없습니다 string.Empty
. 물론 const
필드 또는 로컬 변수 를 정의 const string myString = "";
하려면 다시 ""
유일한 옵션입니다. string.Empty
필드가 일정 하다면 차이가 없을 것입니다. 그러나 그렇지 않은 경우도 있으므로을 사용해야 ""
합니다. 왜 ""
항상 사용하지 않습니까?
string.Empty
하면 코드 기반에서 일관성 을 얻을 수 없으므로 매우 강력한 주장 입니다. 동일한 것을 표현하려면 서로 다른 두 엔티티를 사용해야합니다. 그리고 당신이 할 수없는 일 목록에 추가하려면 : 속성string.Empty
과 함께 사용할 수 없습니다 .
선호 string
합니다 String
. 선택 string.Empty
이상은 ""
하나를 선택하고 그것으로 튀어 나와의 문제이다. 사용의 장점은 string.Empty
당신이 무엇을 의미하는지 아주 분명하다, 당신은 실수로 같은 이상 인쇄 할 수없는 문자를 복사하지 마십시오 "\x003"
당신의에서 ""
.
""
복사 / 붙여 넣기시 위험한 인수 는 무효입니다. 빈 문자열을 복사 / 붙여 넣지 않기 때문입니다. 다른 줄의 경우에는 항상 염두에 두어야합니다.
나는 차임하지 않을 것이지만 여기에 잘못된 정보가 던져지는 것을보고 있습니다.
개인적으로 선호합니다 string.Empty
. 그것은 개인적인 취향이며, 나는 함께 일하는 모든 팀의 의지에 구애받습니다.
다른 사람들이 언급했듯이 string.Empty
와 사이에는 전혀 차이가 없습니다 String.Empty
.
또한 이것은 ""를 사용하는 것이 완벽하게 허용되는 약간의 사실입니다. ""의 모든 인스턴스는 다른 환경에서 객체를 생성합니다. 그러나 .NET은 문자열을 인턴하므로 향후 인스턴스는 인턴 풀에서 동일한 불변 문자열을 가져 오므로 성능 저하는 무시할 수 있습니다. 출처 : Brad Abrams .
String.Empty
그리고 string.Empty
동등합니다. String
BCL 클래스 이름입니다. string
C # 별칭입니다 (또는 원하는 경우 바로 가기). with Int32
와 동일합니다 int
. 더 많은 예제 는 문서 를 참조하십시오 .
지금까지처럼 ""
관한 한, 난 정말 모르겠어요.
개인적으로 나는 항상을 사용 string.Empty
합니다.
거의 모든 개발자가 ""의 의미를 알 수 있습니다. 나는 개인적으로 String.Empty로를 처음 발견하고 정말 있는지 알아 내기 위해 약간의 시간 검색 구글을 지출했다 입니다 똑같은.
string.Empty
있습니까? ""
처음 본 것이 무엇인지 아십니까 ?
이 주제는 꽤 오래되고 길기 때문에이 행동이 다른 곳에서 언급 된 경우 실례합니다. (그리고 이것을 다루는 대답을 알려주세요)
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
기본적으로, 내가 올바르게 이해하면 프로그래머가 경고 메시지로 귀찮게하지 않고 디버깅 목적으로 함수의 반환 값으로 변수를 설정하여 비용 할당 및 문자열의 경우에만 경고를 제한하려고합니다. 공란은 상수가 아니라 필드입니다.
var unused = "literal";
컴파일러 는 선언 을 완전히 최적화 (제거) 할 수 있습니다. 부작용이 없습니다. 반면에 var unused = MyClass.Member;
완전히 제거 할 수는 없습니다. 독서 Member
가 부작용을 일으킬 수 있기 때문 입니다. 접근자가 Member
있는 정적 속성 인 경우 get
getter에 대한 호출을 유지해야합니다. 그러나 Member
정적 필드 인 경우에도 정적 생성자가 실행할 수있는 부작용이있을 수 있습니다. 물론 그렇게하는 것은 나쁜 코딩 스타일 일 것입니다. 그러나 당신은 읽을 더미가 필요합니다 Member
.
콘솔 응용 프로그램에서 다음 방법을 사용하여 매우 간단한 테스트를 수행했습니다.
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는 이 개념을 설명 하는 아주 멋진 블로그를 가지고 있습니다 .
String.Empty를 강력하게 선호합니다. 다른 이유와는 별도로, 내용을 실수로 제거하지 않았지만 주로 국제화를 목적으로한다는 사실을 알 수 있습니다. 따옴표로 묶인 문자열을 보면 항상 새 코드인지 궁금해하고 문자열 테이블에 넣어야합니다. 따라서 코드가 변경 / 검토 될 때마다 "따옴표로 된 것"을 찾아야합니다. 네, 빈 문자열을 걸러 낼 수 있지만 지역화되지 않는다는 것을 알지 않는 한 문자열을 따옴표로 묶지 않는 것이 좋습니다. .
VisualStudio에서 String은 string과 다르게 색상이 코딩되었다고 언급 한 사람은 없습니다. 가독성에 중요합니다. 또한 소문자는 일반적으로 vars 및 type에 사용되며 큰 것이 아니라 String입니다 .Empty는 상수이며 var 또는 type이 아닙니다.
내가 선호하는 것 string.Empty
이상 String.Empty
당신이를 포함 할 필요없이 사용할 수 있기 때문에 using System;
파일에.
""
인수 선택 string.Empty
은 개인 취향이며 팀이 결정해야합니다.
string.Empty
를 가져 오지 않고 상수 를 사용하는 방법에 대해 궁금해하는 사람들을 위해 using System
C #의 키워드는 네임 스페이스가 포함 된 정규화 된 이름으로 변환되어 출력 * .dll 또는 *에 MSIL로 작성 되기만하면됩니다. exe 파일. 따라서 컴파일러가 MSIL string.Empty
과 같이 효과적으로 작성 System.String.Empty
합니다. 그리고 이미 알고 있듯이 정규화 된 유형 이름을 언급하면 코드 파일 맨 위에 네임 스페이스 가져 오기를 건너 뛸 수 있습니다.
나는 차이를 만들지 않습니다. 마지막은 입력하는 것이 가장 빠릅니다 :)
중요하지 않습니다-그들은 정확히 같은 것입니다. 그러나 가장 중요한 것은 일관성 이 있어야 한다는 것입니다
추신 : 나는 항상 이런 종류의 "옳은 일"로 고생합니다.
.NET이 문자열을 처리하는 방식과 관련하여 완전히 코드 스타일 환경 설정입니다. 그러나 여기에 내 의견이 있습니다 :)
정적 메서드, 속성 및 필드를 액세스 할 때 난 항상 BCL 유형 이름을 사용 String.Empty
하거나 Int32.TryParse(...)
또는Double.Epsilon
새 인스턴스를 선언 할 때는 항상 C # 키워드를 사용합니다. int i = 0;
또는string foo = "bar";
코드를 스캔하여 재사용 가능한 명명 된 상수로 결합 할 수 있기 때문에 선언되지 않은 문자열 리터럴을 거의 사용하지 않습니다. 컴파일러는 어쨌든 상수를 리터럴로 대체하므로 마술 문자열 / 숫자를 피하고 이름으로 조금 더 의미를 부여하는 더 많은 방법입니다. 또한 값을 변경하는 것이 더 쉽습니다.
처음 두 가지 중 하나가 허용됩니다. 따옴표 사이에 공백을 두어 버그를 도입하는 것이 상대적으로 쉽기 때문에 마지막 것을 피할 것입니다. 이 특정 버그는 관찰하기가 어렵습니다. 오타가 없다고 가정하면 모두 의미 상 동등합니다.
[편집하다]
또한 항상 string
또는 String
일관성을 위해 사용하고 싶을 수도 있지만 그저 나뿐입니다.
나는 ""를 개인적으로 목격하여 (사소한) 문제가 두 번 발생했습니다. 한 번은 팀 기반 프로그래밍에 익숙하지 않은 주니어 개발자의 실수로 인한 것이었고, 다른 하나는 단순한 오타 였지만 사실은 문자열을 사용하고 있습니다.
그렇습니다. 이것은 많은 판단을 요구하지만 언어가 여러 가지 방법으로 작업을 수행 할 때 컴파일러 감독과 컴파일 시간이 가장 강한 언어에 의존하는 경향이 있습니다. "" 가 아닙니다 . 그것은 특정한 의도를 표현하는 것입니다.
string.EMpty 또는 Strng.Empty를 입력하면 컴파일러에서 잘못했다고 알려줍니다. 바로. 단순히 컴파일되지 않습니다. 개발자 는 컴파일러 (또는 다른 개발자)가 어떤 식 으로든 잘못 해석 할 수 없다는 특정 의도를 인용 하고 있으며 잘못하면 버그를 만들 수 없습니다.
""를 의미 할 때 ""를 입력하거나 그 반대의 경우, 컴파일러는 사용자가 지시 한대로 행복하게 수행합니다. 다른 개발자가 특정 의도를 모을 수도 있고 얻지 못할 수도 있습니다. 버그가 생성되었습니다.
string.Empty 이전에는 EMPTY_STRING 상수를 정의한 표준 라이브러리를 사용했습니다. string.Empty가 허용되지 않는 경우에는 여전히 상수를 사용합니다.
가능할 때마다 컴파일러를 사용하여 작게 만들더라도 사람이 실수 할 가능성을 제거하십시오. IMO는 다른 사람들이 언급 한 것처럼 "가독성"보다 우월합니다.
특이성과 컴파일 시간 시행. 저녁 식사를 위해 무엇입니까.
컴파일러는 장기적으로 모두 동일하게 만들어야합니다. 코드를 쉽게 읽을 수 있도록 표준을 선택하고 준수하십시오.
차이는 매우 적지 만 그 차이는 여전히 존재합니다.
1) ""는 String.Empty가 아닌 객체를 생성합니다. 그러나이 객체는 한 번 생성되며 코드에 다른 ""가 있으면 나중에 문자열 풀에서 참조됩니다.
2) 문자열과 문자열은 동일하지만 도트 표기법은 연산자가 아닌 클래스를 나타내며 대문자로 시작하는 클래스는 다음을 준수하므로 String.Empty (String.Format, String.Copy 등)를 사용하는 것이 좋습니다. C # 코딩 표준
에 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
;-) ... 내 의료 수준이 낮은
빈 문자열은 모두가 호출하는 데 사용하는 이름과 같은 빈 집합과 같습니다 ""
. 또한 공식 언어에서는 길이가 0 인 알파벳으로 만든 문자열을 빈 문자열이라고합니다. 세트와 문자열에는 특별한 기호가 있습니다. 빈 문자열 : ε 및 빈 세트 : ∅. 이 길이가 0 인 문자열에 대해 이야기하려면 빈 문자열이라고 부르므로 모든 사람이 당신이 참조하는 것을 정확하게 알 수 있습니다. 이제 string.Empty
코드에서 사용하지 않는 빈 문자열의 이름을 지정 하면 의도가 명시 적입니다. 단점은 상수가 아니므로 속성과 같이 어디에서나 사용할 수 없다는 것입니다. (기술적 인 이유로 일정하지 않습니다. 참조 소스를 참조하십시오.)