String.Empty가 상수가 아닌 이유는 무엇입니까?
.Net에서 왜 String.Empty가 상수 대신 읽기 전용입니까? 그 결정의 근거가 무엇인지 아는 사람이 있는지 궁금합니다.
그 이유 static readonly
대신에 사용됩니다 const
여기에 마이크로 소프트에 의해 지시 된 바와 같이, 관리되지 않는 코드를 사용하기 때문이다 공유 소스 공용 언어 인프라 2.0 릴리스 . 살펴볼 파일은 sscli20\clr\src\bcl\system\string.cs
입니다.
Empty 상수는 빈 문자열 값을 보유합니다. 컴파일러가 이것을 리터럴로 표시하지 않도록 String 생성자를 호출해야합니다.
이것을 리터럴로 표시하면 네이티브에서 액세스 할 수있는 필드로 표시되지 않습니다.
CodeProject의이 편리한 기사 에서이 정보를 찾았습니다 .
나는 여기에 많은 혼란과 나쁜 반응이 있다고 생각합니다.
우선, const
필드는 static
멤버 ( 인스턴스 멤버 아님)입니다.
섹션 10.4 C # 언어 사양의 상수를 확인하십시오.
상수는 정적 멤버로 간주되지만 상수 선언은 정적 수정자를 요구하거나 허용하지 않습니다.
경우 public const
회원은 정적, 하나는 상수는 새 개체를 만들 것이라고 생각하지 못했습니다.
이 점을 감안할 때 다음 코드 줄은 새 객체 생성과 관련하여 정확히 동일한 기능을 수행 합니다 .
public static readonly string Empty = "";
public const string Empty = "";
다음은 2의 차이점을 설명하는 Microsoft의 참고 사항입니다.
읽기 전용 키워드는 const 키워드와 다릅니다. const 필드는 필드 선언시에만 초기화 할 수 있습니다. 읽기 전용 필드는 선언 또는 생성자에서 초기화 될 수 있습니다. 따라서 읽기 전용 필드는 사용 된 생성자에 따라 다른 값을 가질 수 있습니다. 또한 const 필드는 컴파일 타임 상수이지만 읽기 전용 필드는 런타임 상수에 사용할 수 있습니다 ...
그래서 여기서 유일하게 그럴듯한 대답은 Jeff Yates의 것입니다.
String.Empty read only instead of a constant?
문자열을 일정하게 만들면 컴파일러는 호출하는 모든 곳 에서 실제로 문자열로 바뀌고 코드를 같은 문자열로 채우고 코드가 실행될 때 다른 메모리에서 해당 문자열을 반복해서 읽어야합니다. 데이터.
문자열을 한곳에서만 읽은 상태로두면 String.Empty
프로그램은 같은 문자열을 한곳에 만 보관하고 읽거나 참조하여 데이터를 메모리에 최소로 유지합니다.
또한 String.Empty를 const로 사용하여 dll을 컴파일하고 어떤 이유로 든 String.Empty가 변경되면 컴파일 된 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
클래스 이기 때문에 상수가 될 수 없습니다.
확장 된 토론 :
이 답변을 심사하는 데 유용한 대화가 많이 생겼으며, 삭제하는 대신이 내용이 직접 재생산됩니다.
In .NET, (unlike in Java) string and String are exactly the same. And yes, you can have string literal constants in .NET – DrJokepu Feb 3 '09 at 16:57
Are you saying that a Class cannot have constants? – StingyJack Feb 3 '09 at 16:58
Yes, objects have to use readonly. Only structs can do constants. I think when you use
string
instead ofString
the compiler changes the const into a readonly for you. All to do with keeping C programmers happy. – Garry Shutler Feb 3 '09 at 16:59tvanfosson just explained it a little bit more verbose. "X cannot be a constant, because the containing Y is a class" was just a little bit too context-free ;) – Leonidas Feb 3 '09 at 17:01
string.Empty is static property that returns an instance of the String class, namely the empty string, not the string class itself. – tvanfosson Feb 3 '09 at 17:01
Empty is a readonly instance (it's not a property) of the String class. – senfo Feb 3 '09 at 17:02
Head hurting. I still think I'm right, but now I'm less certain. Research required tonight! – Garry Shutler Feb 3 '09 at 17:07
The empty string is an instance of the string class. Empty is a static field (not a property, I stand corrected) on the String class. Basically the difference between a pointer and the thing it points to. If it weren't readonly we could change which instance the Empty field refers to. – tvanfosson Feb 3 '09 at 17:07
Garry, you don't need to do any research. Think about it. String is a class. Empty is an instance of a String. – senfo Feb 3 '09 at 17:12
There is something I don't quite get: how on earth can the static constructor of the String class create an instance of the String class ? Isn't that some sort of "chicken or the egg" scenario? – DrJokepu Feb 3 '09 at 17:12 5
This answer would be correct for nearly any other class but System.String. .NET does a lot of performance special-casing for strings, and one of them is that you CAN have string constants, just try it. In this case, Jeff Yates has the correct answer. – Joel Mueller Feb 3 '09 at 19:25
As described in §7.18, a constant-expression is an expression that can be fully evaluated at compile-time. Since the only way to create a non-null value of a reference-type other than string is to apply the new operator, and since the new operator is not permitted in a constant-expression, the only possible value for constants of reference-types other than string is null. The previous two comments were taken directly from the C# language specification and reiterate what Joel Mueller mentioned. – senfo Feb 4 '09 at 15:05 5
참고URL : https://stackoverflow.com/questions/507923/why-isnt-string-empty-a-constant
'Programing' 카테고리의 다른 글
캐시되고 PHP로 생성 된 썸네일이 느리게로드됩니다 (0) | 2020.05.19 |
---|---|
사람들은 Go에서 인증을 어떻게 관리하고 있습니까? (0) | 2020.05.19 |
PHP로 PDF를 작성하는 가장 좋은 방법 (0) | 2020.05.19 |
파이썬에서 현재 실행중인 파일의 경로를 얻으려면 어떻게해야합니까? (0) | 2020.05.19 |
ValueError : 둘 이상의 요소가있는 배열의 실제 값이 모호합니다. (0) | 2020.05.19 |