programing

String의 차이점은 무엇입니까?비어 있고 "(빈 문자열)?

telecom 2023. 5. 5. 08:36
반응형

String의 차이점은 무엇입니까?비어 있고 "(빈 문자열)?

에서 입니까?NET의 차이점은 무엇입니까?String.Empty그리고."" 교환 가능한가요, 요?String.Empty문제가 없다는 것을 보장할 수 있습니까?

2.02.0을 사용합니다.NET에서는""는 동안 를 생성합니다.string.Empty객체를 만들지 않습니다ref. 이는 다음을 만듭니다.string.Empty보다 효율적인

2에서는 .vmdk 2.0을 합니다. NET 발생 , 모든항목항""리터럴을 , 는 동한문리참터조을다니합즉럴자열일,,즉▁literal▁refer▁to,""는 와동합다니등다에 합니다..Empty하지만 여전히 그렇게 빠르지는 않습니다..Length == 0.

.Length == 0가장 빠른 옵션이지만,.Empty코드를 조금 더 깨끗하게 만듭니다.

참조하십시오.자세한 내용은 NET 사양을 참조하십시오.

String 간의 차이는 무엇입니까?Empty 와 ", 그리고 그것들은 상호 교환 가능합니다.

string.Empty 읽기 전용 필드인 반면""는 컴파일 시간 상수입니다. 행동하는 는 다음과

C# 4.0 이상의 기본 매개 변수 값

void SomeMethod(int ID, string value = string.Empty)
// Error: Default parameter value for 'value' must be a compile-time constant
{
    //... implementation
}

스위치 문의 대/소문자 표현식

string str = "";
switch(str)
{
    case string.Empty: // Error: A constant value is expected. 
        break;

    case "":
        break;

}

속성 인수

[Example(String.Empty)]
// Error: An attribute argument must be a constant expression, typeof expression 
//        or array creation expression of an attribute parameter type

이전 답변은 에 대한 정답입니다.NET 1.1 (그들이 링크한 게시물의 날짜: 2003 참조).기준으로.NET 2.0 이상에서는 본질적으로 차이가 없습니다.어쨌든 JIT는 힙에서 동일한 개체를 참조하게 됩니다.

C# 사양에 따라 섹션 2.4.4.5: http://msdn.microsoft.com/en-us/library/aa691090(VS.71).aspx

각 문자열 리터럴이 반드시 새 문자열 인스턴스를 생성하는 것은 아닙니다.문자열 동등 연산자(섹션 7.9.7)에 따라 동등한 두 개 이상의 문자열 리터럴이 동일한 어셈블리에 나타나는 경우 이러한 문자열 리터럴은 동일한 문자열 인스턴스를 참조합니다.

브래드 에이브람의 게시물 댓글에 이런 내용이 올라오기도 합니다.

요약하자면, "" vs.끈.공백은 0입니다.JIT는 결국 그것을 알아낼 것입니다.

개인적으로, 저는 JIT가 저보다 훨씬 더 똑똑하다는 것을 알았고, 그래서 저는 그런 마이크로 컴파일러 최적화에 대해 너무 영리해지지 않으려고 노력했습니다.JIT는 () 루프, 중복 코드 제거, 인라인 메소드 등에 대해 I 또는 C# 컴파일러가 사전에 예상할 수 있는 것보다 더 적합한 시간에 전개될 것입니다.JIT가 그 일을 하도록 하라 :)

String.Empty읽기 전용 필드입니다.""컨스트입니다.이는 사용할 수 없다는 것을 의미합니다.String.Empty상수가 아니므로 switch 문에 표시됩니다.

사용하는 편입니다.String.Empty""한 가지로: 단하지만명않은한지가이때문유에지확하순▁for::때문에▁one이:""그리고.""동일하지 않습니다. 첫 번째 것은 실제로 16개의 제로 폭 문자가 들어 있습니다.분명히 유능한 개발자는 코드에 문자를 넣고 너비를 0으로 설정하지 않을 것입니다. 하지만 문자가 코드에 들어가면 유지보수 악몽이 될 수 있습니다.

주의:

  • 이 예에서는 U+FEFF를 사용했습니다.

  • SO가 그 캐릭터들을 먹을지는 확실하지 않지만, 폭이 0인 많은 캐릭터들 중 하나로 직접 시도해 보세요.

  • 저는 https://codegolf.stackexchange.com/ 덕분에 이것을 알게 되었습니다.

또 다른 차이점은 String입니다.비어 있으면 더 큰 CIL 코드가 생성됩니다."와 String을 참조하기 위한 코드는.공백은 같은 길이이며 컴파일러는 문자열 연결을 최적화하지 않습니다(Eric Lippert의 블로그 게시물 참조).빈 인수입니다.다음과 같은 동등한 기능

string foo()
{
    return "foo" + "";
}
string bar()
{
    return "bar" + string.Empty;
}

이 IL 생성

.method private hidebysig instance string foo() cil managed
{
    .maxstack 8
    L_0000: ldstr "foo"
    L_0005: ret 
}
.method private hidebysig instance string bar() cil managed
{
    .maxstack 8
    L_0000: ldstr "bar"
    L_0005: ldsfld string [mscorlib]System.String::Empty
    L_000a: call string [mscorlib]System.String::Concat(string, string)
    L_000f: ret 
}

위의 답변은 기술적으로 정확하지만 코드 가독성이 가장 좋고 예외가 발생할 가능성이 가장 낮은 경우에는 문자열을 사용할 수 있습니다.IsNull 또는 비어 있음

""의 모든 인스턴스는 동일한, 삽입 문자열 리터럴(또는 그래야 합니다)입니다.따라서 ""를 사용할 때마다 힙에 새 개체를 던지지 않고 동일한 내부 개체에 대한 참조만 만들 수 있습니다.그렇기는 하지만, 저는 끈이 더 좋습니다.비어 있습니다. 코드를 더 읽기 쉽게 만드는 것 같아요.

String."은 객체를 만들지 않지만 ""는 객체를 만듭니다.그러나 여기서 지적한 바와 같이 그 차이는 미미합니다.

사용하다String.Empty"".

이것은 메모리 사용량보다는 속도를 위한 것이지만 유용한 팁입니다.""는 리터럴로 작동하므로 리터럴로 작동합니다. 처음 사용할 때는 생성되고 다음 사용할 때는 참조가 반환됩니다.의 인스턴스 ""사용 횟수에 상관없이 메모리에 저장됩니다!여기에는 기억력에 대한 벌칙이 없습니다.문제는 를 사용할 때마다 가 이미 인턴 풀에 있는지 확인하기 위해 비교 루프가 실행된다는 것입니다.반면.String.Empty는 에대참니다입조한▁to▁a▁reference에 대한 참조입니다.""에 저장됩니다.NET Framework 메모리 영역입니다. String.EmptyVB에 대해 동일한 메모리 주소를 가리키고 있습니다.NET 및 C# 애플리케이션. 왜 이 필요로 할 요?""당신이 에 그 언급을 가지고 있을 때.String.Empty?

참조: vs.

string mystring = "";
ldstr ""

ldstr새 개체 참조를 메타데이터에 저장된 문자열 리터럴로 푸시합니다.

string mystring = String.Empty;
ldsfld string [mscorlib]System.String::Empty

ldsfld.

사용하는 편입니다.String.Empty""왜냐하면 IMHO는 더 선명하고 VB-ish가 적기 때문입니다.

String 이후.비어 있는 것은 컴파일 시간 상수가 아니므로 함수 정의에서 기본값으로 사용할 수 없습니다.

public void test(int i=0,string s="")
    {
      // Function Body
    }

코드를 통해 시각적으로 스캔할 때 "는 문자열이 색상화되는 방식으로 색상화된 것으로 나타납니다.비어 있는 것은 일반 클래스 구성원 액세스처럼 보입니다.빠르게 보는 동안 ""를 발견하거나 의미를 직관하는 것이 더 쉽습니다.

문자열을 식별합니다(스택 오버플로 색상화는 정확하게 도움이 되지 않지만 VS에서 이는 더 명확합니다).

var i = 30;
var f = Math.Pi;
var s = "";
var d = 22.2m;
var t = "I am some text";
var e = string.Empty;

Eric Lippert(2013년 6월 17일)는 다음과 같이 썼습니다.
"제가 C# 컴파일러에서 작업한 첫 번째 알고리즘은 문자열 연결을 처리하는 옵티마이저였습니다.불행히도 저는 떠나기 전에 이러한 최적화를 로슬린 코드베이스에 이식할 없었습니다. 누군가가 그것에 도달하기를 바랍니다!"

다음은 2019년 1월 기준 로슬린 x64 결과입니다.이 페이지의 다른 답변들의 합의된 발언에도 불구하고, 현재 x64 JIT는 모든 것이 말하고 끝났을 때 이 모든 사례를 동일하게 처리하고 있는 것으로 보이지 않습니다.

그러나, 특히, 이 예시들 중 하나만이 실제로 전화를 걸게 된다는 것에 주목하세요.String.Concat그리고 저는 그것이 (최적화 감시와는 반대로) 명확한 정확성을 위한 이유라고 생각합니다.다른 차이점들은 설명하기가 더 어려워 보입니다.


default(String) + {default(String)}, ", "String".비어 있음 }

static String s00() => default(String) + default(String);
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    add  rsp,28h
    ret

static String s01() => default(String) + "";
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    add  rsp,28h
    ret

static String s02() => default(String) + String.Empty;
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    mov  rdx,rax
    test rdx,rdx
    jne  _L
    mov  rdx,rax
_L: mov  rax,rdx
    add  rsp,28h
    ret

+ {default(String)}, ", "String.비어 있음 }

static String s03() => "" + default(String);
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    add  rsp,28h
    ret

static String s04() => "" + "";
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    add  rsp,28h
    ret

static String s05() => "" + String.Empty;
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    mov  rdx,rax
    test rdx,rdx
    jne  _L
    mov  rdx,rax
_L: mov  rax,rdx
    add  rsp,28h
    ret

String.공백 + {default(String)}, "", "String.비어 있음 }

static String s06() => String.Empty + default(String);
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    mov  rdx,rax
    test rdx,rdx
    jne  _L
    mov  rdx,rax
_L: mov  rax,rdx
    add  rsp,28h
    ret

static String s07() => String.Empty + "";
    mov  rax,[String::Empty]
    mov  rax,qword ptr [rax]
    mov  rdx,rax
    test rdx,rdx
    jne  _L
    mov  rdx,rax
_L: mov  rax,rdx
    add  rsp,28h
    ret

static String s08() => String.Empty + String.Empty;
    mov  rcx,[String::Empty]
    mov  rcx,qword ptr [rcx]
    mov  qword ptr [rsp+20h],rcx
    mov  rcx,qword ptr [rsp+20h]
    mov  rdx,qword ptr [rsp+20h]
    call F330CF60                 ; <-- String.Concat
    nop
    add  rsp,28h
    ret


시험내역

Microsoft (R) Visual C# Compiler version 2.10.0.0 (b9fb1610)
AMD64 Release
[MethodImpl(MethodImplOptions.NoInlining)]
'SuppressJitOptimization' = false

Entity Framework의 관점에서 보면 EF 버전 6.1.3은 String을 처리하는 것으로 보입니다.유효성을 검사할 때 비어 있는 경우와 ""가 다릅니다.

string.Empty는 유효성 검사를 위해 null 값으로 처리되며 필수(속성) 필드에서 사용되는 경우 유효성 검사 오류가 발생합니다. 반면 " "는 유효성 검사를 통과하고 오류가 발생하지 않습니다.

이 문제는 EF 7+에서 해결될 수 있습니다.참조: - https://github.com/aspnet/EntityFramework/issues/2610 ).

편집: [필수(AllowEmptyStrings = true)]에서 이 문제를 해결하여 문자열을 허용합니다.유효성 검사를 위해 비어 있습니다.

매우 유익한 답변 감사합니다.

제가 틀렸다면 제 무지를 용서해 주세요.VB를 사용하고 있지만 할당되지 않은 문자열(즉, IS Nothing)의 길이를 테스트하면 오류가 반환됩니다.1969년에 프로그래밍을 시작했기 때문에 많이 뒤쳐졌지만 항상 빈 문자열(".")을 연결하여 문자열을 테스트했습니다. 예: (어떤 언어로든): -

if string + "" = ""

여기 계신 모든 분들이 이론적으로 설명을 잘 해주셨습니다.저도 비슷한 의심을 했습니다.그래서 저는 기본적인 코딩을 시도했습니다.그리고 저는 차이를 발견했습니다.여기 차이점이 있습니다.

string str=null;
Console.WriteLine(str.Length);  // Exception(NullRefernceException) for pointing to null reference. 


string str = string.Empty;
Console.WriteLine(str.Length);  // 0

그래서 "Null"은 절대적으로 공허함과 "끈"을 의미하는 것 같습니다.비어 있음"은 어떤 종류의 값을 포함하지만 비어 있음을 의미합니다.

언급URL : https://stackoverflow.com/questions/151472/what-is-the-difference-between-string-empty-and-empty-string

반응형