programing

왜 String이 아닌 거지?상수를 비우십니까?

telebox 2023. 9. 14. 22:30
반응형

왜 String이 아닌 거지?상수를 비우십니까?

왜가.NET에서 왜가String.Empty상수 대신 읽기만 한다고요?그 결정의 배경이 무엇이었는지 아는 사람이 있는지 궁금합니다.

그 이유는static readonly됩니다 됩니다.const는 여기 공유 소스 공통 언어 인프라스트럭처 2.0 릴리스에서 Microsoft에 표시된 대로 관리되지 않는 코드와 함께 사용될 예정입니다.볼 파일은.sscli20\clr\src\bcl\system\string.cs.

빈 상수는 빈 문자열 값을 유지합니다.컴파일러가 이것을 리터럴로 표시하지 않도록 String Constructor를 호출해야 합니다.

이것을 리터럴로 표시하면 네이티브에서 접근할 수 있는 필드로 표시되지 않습니다.

코드프로젝트의 이 편리한 기사에서 이 정보를 찾았습니다.

여기는 혼란과 나쁜 반응이 많은 것 같습니다.

은.conststatic구성원(인스턴스 구성원이 아님).

섹션 10.4 C# 언어 사양의 상수를 확인합니다.

상수는 정적 멤버로 간주되지만 상수 선언은 정적 수정자를 필요로 하지도 않고 허용하지도 않습니다.

한다면public const구성원은 정적이므로 상수가 새 개체를 생성한다고 볼 수 없습니다.

이를 감안하면, 다음 코드 행은 새 객체의 생성과 관련하여 정확히 동일한 작업을 수행합니다.

public static readonly string Empty = "";
public const string Empty = "";

다음은 두 가지 차이점을 설명하는 Microsoft의 노트입니다.

read only 키워드는 const 키워드와 다릅니다.const 필드는 필드 선언 시에만 초기화할 수 있습니다.읽기 전용 필드는 선언 시 또는 생성자에서 초기화할 수 있습니다.따라서 읽기 전용 필드는 사용되는 생성자에 따라 다른 값을 가질 수 있습니다.또한 const 필드는 컴파일 시간 상수이지만 read only 필드는 런타임 상수에 사용할 수 있습니다.

그래서 나는 여기서 유일하게 그럴듯한 답은 제프 예이츠의 것이라고 생각합니다.

String.Empty read only instead of a constant?

문자열을 일정하게 만들면 컴파일러가 호출하는 모든 곳에서 실제 문자열로 대체되고 코드가 실행되면 다른 메모리 데이터에서 해당 문자열을 반복해서 읽어야 합니다.

만약 당신이 당신의 문자열을 그대로 한 곳에만 읽도록 놔둔다면,String.Empty을 한 - 에 최소한으로 은 한 을 에만 하고 - 를 합니다 에 합니다 에 를 은 한

또한 문자열을 사용하여 dll을 컴파일하는 경우.string은 string으로 .사항을 은 더 . 이 하면 된 dll 하지 하게 하지 하게 cost통화할 때마다 실제로 문자열의 복사본을 보관하도록 내부 코드를 만듭니다.

예를 들어 다음 코드를 참조하십시오.

public class OneName
{
    const string cConst = "constant string";
    static string cStatic = "static string";
    readonly string cReadOnly = "read only string";

    protected void Fun()
    {
        string cAddThemAll ;

        cAddThemAll = cConst;
        cAddThemAll = cStatic ;
        cAddThemAll = cReadOnly;    
    }
}

컴파일러에 의해 다음과 같이 제공됩니다.

public class OneName
{
    // note that the const exist also here !
    private const string cConst = "constant string";
    private readonly string cReadOnly;
    private static string cStatic;

    static OneName()
    {
        cStatic = "static string";
    }

    public OneName()
    {
        this.cReadOnly = "read only string";
    }

    protected void Fun()
    {
        string cAddThemAll ;

        // look here, will replace the const string everywhere is finds it.
        cAddThemAll = "constant string";
        cAddThemAll = cStatic;
        // but the read only will only get it from "one place".
        cAddThemAll = this.cReadOnly;

    }
}

그리고 집합소에서

        cAddThemAll = cConst;
0000003e  mov         eax,dword ptr ds:[09379C0Ch] 
00000044  mov         dword ptr [ebp-44h],eax 
        cAddThemAll = cStatic ;
00000047  mov         eax,dword ptr ds:[094E8C44h] 
0000004c  mov         dword ptr [ebp-44h],eax 
        cAddThemAll = cReadOnly;
0000004f  mov         eax,dword ptr [ebp-3Ch] 
00000052  mov         eax,dword ptr [eax+0000017Ch] 
00000058  mov         dword ptr [ebp-44h],eax 

편집 : 오타 수정

이 대답은 역사적인 목적을 위해 존재합니다.

원래:

왜냐하면 ㅇString는 클래스이므로 상수가 될 수 없습니다.

확장 토론:

이 답변을 검토하는 과정에서 많은 유용한 대화가 이루어졌고, 이 내용은 삭제하는 대신 직접 재생됩니다.

.NET에서는 (Java와 달리) string과 String이 완전히 동일합니다.예, 에서 문자열 리터럴 상수를 가질 수 있습니다.NET – 닥터 조케푸 2009년 2월 3일 16:57

클래스는 상수를 가질 수 없다는 뜻입니까?– Stingy Jack 2009년 2월 3일 16:58

only, 는 을 해야 해야 을 사용해야 합니다.구조체만 상수를 수행할 수 있습니다.내 생각에 당신이 사용할 때string에 대신에String컴파일러는 const를 당신만을 위한 읽기로 바꿉니다.모두 C 프로그래머들을 행복하게 하는 것과 관련이 있습니다.– 게리셔틀러 2009년 2월 3일 16:59

tvanfosson은 조금 더 장황하게 설명했습니다."X는 상수가 될 수 없다, 왜냐하면 포함하는 Y는 클래스이기 때문이다"는 것은 단지 문맥이 너무 자유로웠을 뿐입니다 ;) – 레오니다스 2009년 2월 3일 17:01

string.Empty는 String 클래스의 인스턴스(String 클래스 자체가 아닌 빈 문자열)를 반환하는 정적 속성입니다.– tvanfoss 2009년 2월 3일 17:01

비어 있으면 String 클래스의 읽기 전용 인스턴스(속성이 아님)입니다.– senfo 2009년 2월 3일 17:02

머리가 아파요.저는 아직도 제가 옳다고 생각하지만, 지금은 확신이 덜 듭니다.오늘 밤 연구가 필요합니다! – Garry Shutler 2009년 2월 3일 17:07

빈 문자열은 문자열 클래스의 인스턴스입니다.빈은 String 클래스의 정적 필드(속성이 아니라 수정됨)입니다.기본적으로 포인터와 포인터가 가리키는 것 사이의 차이입니다.읽지 않은 경우에만 빈 필드가 참조하는 인스턴스를 변경할 수 있습니다.– tvanfoss 2009년 2월 3일 17:07

개리, 조사할 필요 없어요생각해 보세요.문자열은 클래스입니다.빈은 문자열의 인스턴스입니다.– senfo 2009년 2월 3일 17:12

이해할 수 없는 것이 있습니다. 도대체 String 클래스의 정적 생성자가 String 클래스의 인스턴스를 생성할 수 있는 방법은 무엇입니까?'닭인지 알인지' 같은 시나리오 아닌가요?– 닥터 조케푸 2009년 2월 3일 17:125

이 대답은 시스템을 제외한 거의 모든 다른 클래스에 정확할 것입니다.끈...NET은 문자열에 대한 성능 스페셜 케이스를 많이 하는데, 그 중 하나가 문자열 상수를 가질 수 있다는 것입니다. 그냥 해보세요.이 경우, 제프 예이츠가 정답을 맞았습니다.– 조엘 뮬러 2009년 2월 3일 19:25

§ 7.18에 설명되어 있는 것처럼, 상수 표현은 컴파일 타임에 완전하게 평가될 수 있는 표현입니다.문자열이 아닌 참조 유형의 null이 아닌 값을 만드는 유일한 방법은 새 연산자를 적용하는 것뿐이며, 상수 표현식에서는 새 연산자가 허용되지 않으므로 문자열이 아닌 참조 유형의 상수에 대해 가능한 유일한 값은 null입니다.앞의 두 코멘트는 C# 언어 사양에서 직접 가져온 것이며 Joel Mueller가 언급한 것을 반복합니다.– senfo 2009년 2월 4일 15시 05분

언급URL : https://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant

반응형