C #에서는 문자열 값을 빈 문자열로 초기화하려고합니다.
어떻게해야합니까? 올바른 방법은 무엇이며, 그 이유는 무엇입니까?
string willi = string.Empty;
또는
string willi = String.Empty;
또는
string willi = "";
또는 무엇을?
귀하와 귀하의 팀이 가장 잘 읽을 수있는 것을 사용하십시오.
다른 대답은 당신이 사용할 때마다 새로운 문자열이 생성 될 것을 제안했습니다.""
. 이것은 사실이 아닙니다. 문자열 인턴하기 때문에 어셈블리 당 한 번 또는 AppDomain 당 한 번 (또는 전체 프로세스에 대해 한 번 - 해당 정면에 확실하지 않음) 만들어집니다. 이 차이는 무시해도됩니다 -거대한의미 없는.
그러나 어느 것이 더 읽기 쉽다고 생각하는지는 다른 문제입니다. 그것은 주관적이고 사람마다 다를 것입니다 - 그래서 당신이 당신 팀의 대부분의 사람들이 무엇을 찾았는지 알아 내고, 모든 것이 일관성을 위해 함께 할 것을 제안합니다. 개인적으로 나는 찾는다.""
읽기 쉽습니다.
그 주장은""
과" "
서로 쉽게 착각해서 나를 정말로 씻지 않는다. 비례 글꼴을 사용하지 않는 한 (그리고 나는어떤개발자라면 차이를 쉽게 알 수 있습니다.
string.Empty
상수가 아닙니다.. 이것은 컴파일 타임 상수가 필요한 많은 경우에,string.Empty
합법적 인 것은 아닙니다. 이것은 포함한다case ""
블록switch
명령문,선택적 매개 변수, 적용시 매개 변수 및 특성속성들, 그리고 많은 다른 상황들 (독자들에게 남음)이있다. 그렇게 주어진string.Empty
몇 가지 일반적인 상황에서는 허용되지 않습니다.""
- 전 대회. - Jeppe Stig Nielsen
퍼포먼스와 코드 생성의 관점에서는 실제로 차이점이 없습니다. 성능 테스트에서, 그들은 앞뒤로 갔고 어느 쪽이 더 빠르다가 다른 쪽과 밀리 세컨드 만 갔다.
장면 코드 뒤에서 보면 실제로 차이점이 보이지 않습니다. 유일한 차이점은 IL에 있습니다.string.Empty
opcode를 사용한다.ldsfld
과""
opcode를 사용한다.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
코딩의 근본적인 본질은 프로그래머로서의 우리의 임무는 우리가하는 모든 결정이 절충이라는 것을 인식하는 것입니다. [...]간결함으로 시작하십시오. 테스트에 필요한 다른 치수를 늘리십시오.
따라서 더 적은 코드가 더 나은 코드입니다 : Prefer""
에string.Empty
또는String.Empty
. 그 둘은6 배 이상추가적인 이점이 없으며 정확한 정보를 표현하기 때문에 확실한 명확성은 없습니다.
i
~이다.긴 변수 이름보다 낫다. 좀 더 일반적이고 더 짧은 변수 이름동일한 정보를 전달하는, 같은 선명도, 항상 바람직합니다. 필요한 정보를 표현하는 것입니다.필요한 것특정 문자 길이, 나는 이것을 부정하지 않습니다 (아무도 없습니다). - Konrad Rudolph
한 가지 차이점은switch-case
구문, 쓸 수 없다.case string.Empty:
왜냐하면 그것은 상수가 아니기 때문입니다. 당신은Compilation error : A constant value is expected
자세한 정보는이 링크를보십시오.문자열 빈 대 빈 따옴표
switch
성명은 아주 좋은 본보기 중 하나입니다. 또한 선택적 매개 변수를 만들면void MyMethod(string optional = "") { ... }
, 또한 사용할 수 없습니다.string.Empty
. 물론 당신이 정의하고 싶다면const
필드 또는 로컬 변수,const string myString = "";
다시""
유일한 옵션입니다. 을 텐데string.Empty
끊임없이 변화하는 분야가 아니 었습니다. 하지만 그렇지 않은 경우가 있으므로 어떤 경우에는 사용해야합니다.""
. 그래서 왜 사용하지""
항상? - Jeppe Stig Nielsenstring.Empty
너를 얻지 못하게 해.일관성코드베이스에서 : 동일한 것을 표현하기 위해서는 두 개의 엔티티를 사용해야합니다. 할 수없는 일 목록에 추가하면 사용할 수 없습니다.string.Empty
와속성들. - Pragmateek
내가 좋아할거야.string
에String
. 고르는string.Empty
위에""
하나를 선택하고 그것을 고집하는 문제입니다. 사용의 이점string.Empty
그것은 당신이 의미하는 것이 아주 분명하고, 당신은 실수로 인쇄 할 수없는 문자를 복사하지 않습니다."\x003"
너의""
.
""
빈 문자열을 복사 / 붙여 넣기하지 않기 때문에 복사 / 붙여 넣기가 무효화 될 때 위험합니다. 다른 문자열의 경우 항상주의해야 할 점이 있습니다. - Timo
나는 차임을하지 않을 것이지만, 잘못된 정보가 여기에 버려지고있는 것을보고 있습니다.
나는 개인적으로 선호한다.string.Empty
. 그것은 개인적인 취향이며, 나는 어떤 팀과 함께 작업 하던지의 의지에 따라 사안별로 구부린다.
다른 사람들이 언급했듯이,string.Empty
과String.Empty
.
또한 이것은 거의 알려진 사실이며, ""를 사용하는 것이 완벽하게 허용됩니다. ""의 모든 인스턴스는 다른 환경에서 객체를 만듭니다. 그러나 .NET 인턴은 문자열을 인 텐트하므로 미래 인스턴스는 인턴 풀에서 동일한 불변 문자열을 가져 오며 모든 성능 적중률은 무시할 수 있습니다. 출처:브래드 에이 브람스.
나는 개인적으로 더 복잡한 것을 좋은 이유가없는 한 개인적으로 ""선호한다.
String.Empty
과string.Empty
동등하다.String
BCL 클래스 이름입니다.string
C #별칭 (또는 경우에 따라 바로 가기)입니다. ~와 같은Int32
과int
. 만나다문서더 많은 예제.
한""
걱정된다. 나는 정말로 모른다.
개인적으로, 나는 항상string.Empty
.
밖에있는 모든 개발자는 ""무엇을 의미하는지 알 것입니다. 나는 개인적으로 String.Empty 처음으로 발생하고 그들이 진짜로 알아낼 시간을 구글 검색 시간을 보내고했다아르똑같은 것.
string.Empty
? 너 알았어.""
네가 처음 본거야? - David R Tribble
이 주제는 꽤 오래되고 길기 때문에이 행동이 다른 곳에서 언급 되었다면 저를 용서해주십시오. (그리고이 문제를 다루는 답을 가르쳐주세요)
내가 사용하는 경우 컴파일러의 동작에 차이점을 발견했습니다.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
. - Jeppe Stig Nielsen
콘솔 응용 프로그램에서 다음과 같은 기능을 사용하여이 간단한 테스트를 수행했습니다.
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
다른 구문을 사용하여 초기화되었지만 메모리에서 정확히 동일한 문자열 (길이가 0 인 문자열)을 가리키고 있습니다. NET 4.5 콘솔 응용 프로그램에서이 테스트를 수행했습니다. 따라서 내부적으로는 아무런 차이가 없으며, 프로그래머로 사용하기를 원하는 모든 것이 편리합니다. 이 문자열 클래스의 동작은 다음과 같이 알려져 있습니다.인턴 문자열in .Net. 에릭 리 퍼트 (Eric Lippert)는 아주 좋은 블로그를 가지고 있습니다.이리이 개념을 설명합니다.
위의 모든 것.
교황청에는 더 많은 것들이 많이 있습니다. 어떤 나무 껍질이 나무에 가장 잘 어울리는 지, 나는 잔털이 짙은 갈색으로 생각합니다.
나는 String.Empty를 강력히 선호합니다. 다른 이유는 무엇인지 알고 당신이 실수로 내용을 삭제하지 않았다는 것을 확실히하기 위해서입니다. 주로 국제화를 위해 따옴표로 된 문자열을 보면 새로운 코드인지 항상 궁금해하며 문자열 테이블에 넣어야합니다. 그래서 코드가 변경 / 검토 될 때마다 "따옴표로 된"것을 찾아야합니다. 그렇다면 빈 문자열을 필터링 할 수 있습니다. 그러나 사람들에게 그것이 지역화되지 않을 것이라는 것을 알지 않는 한 문자열을 따옴표에 넣지 않는 것이 좋습니다. .
아무도 VisualStudio String에서 색깔이 다른 것과 문자열이 다름을 언급했습니다. 가독성을 위해 중요합니다. 또한 소문자는 보통 vars 및 형식에 사용되지만 큰 문제는 아니지만 String.Empty는 상수이며 var 또는 형식이 아닙니다.
나는 차이를 만들지 않는다. 마지막 하나는 입력하는 것이 가장 빠릅니다 :)
string
동의어이다.System.String
유형, 그들은 동일합니다.
값도 동일합니다.string.Empty == String.Empty == ""
나는 코드에서 문자 상수 ""를 사용하지 않을 것이다.string.Empty
또는String.Empty
- 프로그래머가 무엇을 의미하는지 쉽게 알 수 있습니다.
중에서string
과String
나는 소문자를 좋아한다.string
더 많은 이유는 필자가 오랜 세월 동안 델파이를 사용 해왔고 Delphi 스타일은 소문자 였기 때문입니다.string
.
그래서, 내가 네 상사라면, 너는 쓸거야.string.Empty
그것은 중요하지 않습니다 - 그들은 똑같은 것입니다. 그러나, 중요한 것은 당신이일관성이 있어야한다.
추신. 저는 항상 이런 종류의 "옳은 일"과 투쟁합니다.
나는 세 번째를 사용하지만 다른 두 개는 첫 번째가 덜 이상하게 보입니다. string은 String의 별칭입니다.하지만 할당을 통해 문자열이 표시되는 것을 느낍니다.
처음 두 가지 중 하나가 나에게 받아 들여질 것입니다. 따옴표 사이에 공백을 넣음으로써 버그를 도입하는 것이 비교적 쉽기 때문에 나는 마지막 것을 피할 것입니다. 이 특정 버그는 관찰로 찾기가 어려울 것입니다. 오타가 없다고 가정하면 모두 의미 론적으로 동일합니다.
[편집하다]
또한 언제든지 다음 중 하나를 사용하는 것이 좋습니다.string
또는String
일관성을 위해,하지만 그것은 나뿐입니다.
이는 코드 스타일 환경 설정이며, .NET에서 문자열을 처리하는 방식입니다. 그러나, 여기에 내 의견이 있습니다 :)
정적 메서드, 속성 및 필드에 액세스 할 때 항상 BCL Type 이름을 사용합니다.String.Empty
또는Int32.TryParse(...)
또는Double.Epsilon
새 인스턴스를 선언 할 때 항상 C #키워드를 사용합니다.int i = 0;
또는string foo = "bar";
필자는 선언되지 않은 문자열 리터럴을 거의 사용하지 않고 코드를 스캔하여 재사용 가능한 명명 된 상수로 결합 할 수 있습니다. 컴파일러는 상수를 리터럴로 대체합니다. 따라서 이것은 마술 문자열 / 숫자를 피하고 조금 더 의미를 부여 할 수있는 방법입니다. 또한 값을 변경하는 것이 더 쉽습니다.
저는 개인적으로 (사소한) 문제를 두 번이나 목격했습니다. 한 번은 팀 기반 프로그래밍에 익숙하지 않은 중학교 개발자의 실수로 인한 것이었고 다른 하나는 간단한 오타 였지만 실제로는 string.Empty를 사용하면 두 가지 문제를 모두 피할 수있었습니다.
예, 이것은 매우 중요한 판단입니다 만, 언어가 여러 가지 방법으로 작업을 수행 할 때 컴파일러의 감독과 컴파일 타임이 가장 엄격한 언어를 사용하는 경향이 있습니다. 그건아니"". 구체적인 의도를 표현하는 것이 전부입니다.
string.empty 또는 Strng.Empty를 입력하면 컴파일러에서 잘못했음을 알립니다. 바로. 단순히 컴파일되지 않습니다. 당신이 인용하고있는 개발자로서특유한컴파일러 (또는 다른 개발자)가 어떤 식 으로든 오해 할 수 없으며, 잘못했을 때 버그를 만들 수 없다는 것을 의미합니다.
""또는 그 반대의 경우 ""라고 입력하면 컴파일러는 기꺼이 말한대로합니다. 다른 개발자가 특정 의도를 수집 할 수도 그렇지 않을 수도 있습니다. 버그가 생성되었습니다.
String.Empty는 EMPTY_STRING 상수를 정의한 표준 라이브러리를 사용하기 훨씬 전에 사용되었습니다. string.Empty가 허용되지 않는 경우에도 여전히이 상수를 사용합니다.
가능할 때마다 컴파일러를 사용하여 작업하고 사용자의 실수를 피할 수 있습니다. IMO, 이것은 다른 사람들이 인용 한 것처럼 "가독성"에 우선합니다.
특이성 및 컴파일 시간 적용. 그것은 저녁 식사를위한 것입니다.
나는 좋겠다.string.Empty
위에String.Empty
포함 할 필요가 없기 때문에 사용할 수 있습니다.using System;
귀하의 파일에.
피킹에 관해서는""
위에string.Empty
개인적인 취향이므로 팀원이 결정해야합니다.
string.Empty
가져 오지 않고 상수using System
namespace - C #의 키워드는 출력 * .dll 또는 * .exe 파일에 MSIL로 작성되기 전에 네임 스페이스를 포함하는 정규화 된 이름으로 변환됩니다. 그렇게 효과적으로string.Empty
다음과 같이 작성됩니다.System.String.Empty
MSIL에서 컴파일러에 의해. 그리고 이미 정규화 된 형식 이름을 언급하면 코드 파일의 맨 위에 네임 스페이스를 가져 오는 작업을 건너 뛸 수 있음을 알고있을 것입니다. - RBT
컴파일러는 장기적으로 컴파일러를 모두 동일하게 만들어야합니다. 코드를 쉽게 읽을 수 있도록 표준을 선택하고 그대로 사용하십시오.
나는 단지 약간의 코드를보고 있었고이 질문은 내가 전에 언젠가 읽었던 내 마음 속으로 쏟아져 나왔다. 이것은 가독성의 문제입니다.
다음 C #코드를 고려하십시오.
(customer == null) ? "" : customer.Name
대
(customer == null) ? string.empty : customer.Name
나는 개인적으로 후자를 모호하지 않고 쉽게 읽을 수있다.
다른 사람들이 지적한 바와 같이 실제 차이는 무시할 수 있습니다.
내 코드에서 노란색으로 색이 지정 될 것이기 때문에 ""사용합니다 ... Visual Studio Code 테마에서 String.Empty는 모두 흰색입니다. 그리고 나는 그것이 내게 가장 중요하다고 믿습니다.
나는 두 번째 것이 "적절하다"고 생각하지만 솔직히 말해서 나는 그것이 중요 할 것이라고 생각하지 않는다. 컴파일러는 똑같은 바이트 코드를 컴파일 할만큼 똑똑해야합니다. 나는 나 자신을 사용한다.
에http://blogs.msdn.com/b/brada/archive/2003/04/22/49997.aspx:
데이빗이 암시 하듯이,
String.Empty
과""
꽤 작지만 차이가 있습니다.""
실제로 객체를 생성합니다. 문자열 인턴 풀에서 꺼내지 만 그래도 ... whileString.Empty
아무 객체도 만들지 않으므로 궁극적으로 궁극적으로 메모리 효율성을 찾고 있다면String.Empty
. 그러나, 차이점은 당신이 코드에서 결코 보지 않으려 고하는 trival이라는 것을 명심해야합니다 ...
~에 관해서는System.String.Empty
또는string.Empty
또는String.Empty
... 내 치료 수준이 낮습니다 ;-)
빈 문자열은 빈 집합과 같습니다. 모든 사람이 호출 할 때 사용하는 이름입니다.""
. 또한 형식 언어에서 알파벳 길이가 0 인 문자열을 빈 문자열이라고합니다. set과 string에는 모두 특별한 기호가 있습니다. 빈 문자열 : ε 및 빈 집합 : ∅. 이 길이가 0 인 문자열에 대해 이야기하고 싶다면 빈 문자열이라고 부를 것이므로 누구나 당신이 말하는 것을 정확히 알고 있습니다. 이제는 빈 문자열을 왜 사용하지 않는지 이름을 짓습니다.string.Empty
코드에서 의도는 명시 적임을 보여줍니다. 단점은 속성과 같이 상수가 아니며 모든 곳에서 사용할 수 없다는 점입니다. (기술적 인 이유로 상수가 아니라 참조 소스를 참조하십시오.)
차이는 매우 적지 만 그 차이는 여전히 존재합니다.
1) ""String.Empty 않는 개체를 만듭니다. 그러나이 객체는 한 번 생성되며 코드에 다른 ""이 있으면 나중에 문자열 풀에서 참조됩니다.
2) 문자열과 문자열은 동일하지만 도트 표기법은 연산자가 아닌 클래스를 나타내며 대문자로 시작하는 클래스는 다음을 준수하므로 String.Empty (String.Format, String.Copy 등)를 사용하는 것이 좋습니다. C #코딩 표준.