2009-12-11 6 views
3

string.Empty가 .Net 언어로 ""를 사용하는 것보다 효율적이라는 것이 확실합니다. 제가 알고 싶습니다. 왜 더 효율적입니까?.net에서 string.Empty가 ""보다 효율적입니까?

+8

더 효율적이라고 생각하는 이유는 무엇입니까? –

+0

@Gregory - StyleCop은 ""에서 string.Empty로 변경하도록 권장합니다. 나는이 사실 뒤에 어떤 추론이 있다고 생각하고 싶다 ... –

+2

하지만 당신은 왜 그 추론이 효율성과 관련이 있다고 생각하니? – jalf

답변

13

나는 대부분의 경우 차이가 없다고 생각합니다. 일반적으로 코드에 ""을 사용하면이 문자열이 인턴되고 동일한 문자열 인스턴스가 다시 사용됩니다. 따라서 String.Empty과 비교했을 때 ""을 사용할 때 문자열 인스턴스가 더 이상 존재하지 않습니다.

당신이 증명하려면 : 당신도 추가 문자열 인스턴스를 생성하지 않고 접근 방식을 혼합 할 수 있도록 또한, String.Empty 그들 중 하나를 교체하는 경우 True

Dim a As String 
Dim b As String 

a = "" 
b = "" 

Console.WriteLine(Object.ReferenceEquals(a, b)) ' Prints True ' 

위의 코드를 인쇄합니다.

결론 : 차이점은 개인 취향입니다.

+0

puplic 정적 문자열에 액세스하는 것과 비교하여 interned 문자열에 액세스하는 오버 헤드가 있습니까? – JonoW

+1

확인을 클릭하십시오. 많은 IT 괴짜가 ""의 사용을 싫어하기 때문에 이것은 알아두면 좋습니다. 나는 이것을 무시할 가치가있는 또 다른 StyleCop 규칙이라고 생각한다. –

+0

@JonoW : 측정 해 본 적은 없지만 차이가 있다면 놀랄 것입니다. –

2

""이상의 string.Empty 사용시 성능이 향상되지 않는다고 생각합니다.

그 문제는 개인 취향입니다.

+2

동의하지만 'string.Empty'는 분명히 ""보다 명확합니다. –

+1

String을 사용하는 것이 좋습니다.비어있는, 확실하게 이것은 ""보다 더 시각적으로 호소력이 있기 때문 만 아닌가? –

+3

Sebastian - 올바르지 않습니다. ""가 코드에있는 경우 다른 문자열 상수와 마찬가지로 ""에 대한 모든 참조가 동일한 인스턴스에 인계됩니다. – thecoop

0

string.Empty는 생성 된 싱글 톤 정적 const 문자열이지만 ""비어있는 새 문자열을 만듭니다.

+4

... 이것은 또한 인턴 된 것을 의미합니다. 사용 된 횟수와 관계없이 메모리에 문자열의 복사본이 하나뿐입니다. – ctford

+0

문자열 조작을 많이 사용하는 경우 더 효율적입니다! –

+4

""참조 할 때마다 새 인스턴스를 만들지 않으므로 "" " – thecoop

6

우선, 나는 그것이 더 효율적이라는 것을 확신하지 못합니다. 정적 인 이유는 기본적으로 상수입니다. 하나의 빈 문자열 만 있습니다.

더 중요한 문제는 .NET에서 문자열 인 에이블 링에 약간의 불일치가 있기 때문에 사용중인 런타임 버전에 따라 예상 결과가 항상 반환되는 것은 아니며 String.empty와 비교할 수 있습니다. Eric Lippert가 그것에 대해 매혹적인 블로그 게시물을 작성했습니다 here. 응용 프로그램에서 빈 문자열의 인스턴스를 생성합니다

object obj = ""; 
string str1 = ""; 
string str2 = String.Empty; 
Console.WriteLine(obj == str1); // true 
Console.WriteLine(str1 == str2); // true 
Console.WriteLine(obj == str2); // sometimes true, sometimes false?! 
+1

세 번째 줄은 결코 거짓이 아닙니다. 아마도 당신은 객체를 의미 할 것입니다. –

2

""

(에릭의 게시물에서 촬영 예). 물론 .NET의 인턴은 문자열 상수를 사용하지만 여전히 하나의 인스턴스를 만듭니다. 반면에 String.Empty은 인스턴스를 만들지 않습니다. 이 중 일부 어셈블러를 기반으로 증거를 읽고 공상 경우

관련 문제