왜 String이 아닌 거지?상수를 비우십니까?
왜가.NET에서 왜가String.Empty상수 대신 읽기만 한다고요?그 결정의 배경이 무엇이었는지 아는 사람이 있는지 궁금합니다.
그 이유는static readonly됩니다 됩니다.const는 여기 공유 소스 공통 언어 인프라스트럭처 2.0 릴리스에서 Microsoft에 표시된 대로 관리되지 않는 코드와 함께 사용될 예정입니다.볼 파일은.sscli20\clr\src\bcl\system\string.cs.
빈 상수는 빈 문자열 값을 유지합니다.컴파일러가 이것을 리터럴로 표시하지 않도록 String Constructor를 호출해야 합니다.
이것을 리터럴로 표시하면 네이티브에서 접근할 수 있는 필드로 표시되지 않습니다.
코드프로젝트의 이 편리한 기사에서 이 정보를 찾았습니다.
여기는 혼란과 나쁜 반응이 많은 것 같습니다.
은.const는static구성원(인스턴스 구성원이 아님).
섹션 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:59tvanfosson은 조금 더 장황하게 설명했습니다."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
'programing' 카테고리의 다른 글
| Oracle 데이터베이스에서 데이터 아카이빙을 수행하는 가장 좋은 방법은 무엇입니까? (0) | 2023.09.14 |
|---|---|
| PHP - 여러 파일 업로드 (0) | 2023.09.14 |
| 은 Woocmerce용 데이터베이스에 주문 상태를 저장합니다. (0) | 2023.09.14 |
| 스크롤 바가 크롬의 페이지 너비에 추가되지 않도록 합니다. (0) | 2023.09.14 |
| PL/SQL 쿼리 쉼표로 구분된 문자열 (0) | 2023.09.14 |