'const string'vs. 'static readonly string'in C #


답변:


171

const문자열 을 사용 하면 컴파일러는 compile-time에 문자열의 값 을 포함합니다 .
따라서 const다른 어셈블리 의 값을 사용한 다음 원래 어셈블리를 업데이트하고 값을 변경하면 다시 컴파일 할 때까지 다른 어셈블리에 변경 내용이 표시되지 않습니다 .

static readonly문자열은 런타임에 찾아 지는가 일반 필드입니다. 따라서 다른 어셈블리에서 필드 값이 변경되면 다시 컴파일하지 않고 어셈블리가로드되는 즉시 변경 내용이 표시됩니다.

이것은 또한 것을 의미 static readonly문자열과 같은 일정하지 않은 부재, 사용 Environment.UserName또는 DateTime.Now.ToString(). const문자열은 다른 상수 또는 리터럴을 사용하여 초기화 할 수 있습니다.
또한 static readonly문자열은 정적 생성자에서 설정할 수 있습니다. const캐릭터는 초기화 된 인라인 될 수 있습니다.

a static string는 수정할 수 있습니다. static readonly대신 사용해야 합니다.


25
+1, 그리고 실용적이고 의미 포인트의보기에서 명백한 결론은 : const상수 만 사용되어야합니다 - 상수 값 인 결코 , 영원히 , 영원히 변하지 않는합니다.
LukeH 2010

3
@LukeH는 결코, 결코 조금 강하지 않습니다. 개인 문자열을 const로 선언하고 두 재 컴파일 이벤트 사이에서 변경하는 경우 발생할 수있는 나쁜 일을 생각할 수 없습니다.
Brenda Bell

5
@Brenda : private const엄밀히 말하면 상수가 아닌 값을 사용한다는 것을 인정하겠습니다 . 기본적으로 const마이크로 최적화 목적으로 오용 하고 있습니다. 비록 그것이 나를 위선자로 만들더라도 나는 나의 "절대, 절대, 절대" 진술을지지 할 것입니다. ;)
LukeH

특히 스트링의 경우 성능은 어떻습니까? 각 const 사용은 메모리에 문자열의 새 복사본을 생성합니까?
Andrii

@Andrii 아니요, 상수 문자열은 한 번 생성됩니다. 각 사용은 메모리에서 동일한 참조를 갖습니다.
Migg

43

다음은 장단점에 대한 좋은 분석입니다 .

따라서 값이 변경 될 가능성이 거의 없거나 외부 앱 / libs가 상수를 사용하지 않을 경우 상수를 사용해야하는 것으로 보입니다. 런타임 계산이 필요하거나 외부 소비자가 요인 인 경우 정적 읽기 전용 필드를 사용해야합니다.


19
기사에서 매우 흥미로운 점- "상수는 컴파일 타임에 분명히 처리되는 반면 정적 읽기 전용 필드는 런타임에 평가 될 때 설정됩니다. 상수 값이 컴파일러에 의해 대체된다는 사실 상수 값을 참조하는 라이브러리 / 어셈블리는 상수 값이 변경되면 다시 컴파일해야 함을 의미합니다. 정적 읽기 전용 필드를 참조하는 라이브러리는 값이 아닌 필드를 참조하므로 필요없이 필드의 모든 변경 사항을 선택합니다. "재 컴파일
s_hewitt

1
네, 저도 읽었고 잠시 시간을 보냈습니다. 나는 그것을 확실히 몰랐다.
spinon 2010-07-06

다음은 Google 캐시 버전입니다. webcache.googleusercontent.com/…
spinon

2
참조 링크는 더 이상 사용할 수 없습니다.
Salomon Zhang

이것은 해결책으로 표시된 답변에 대한 훌륭한 칭찬입니다. 사용법을 정의하는 것은 매우 유용합니다. 나에게서 +1.
Bonez024

11

const

public const string MyStr;

A는 컴파일 시간 상수 (당신은 예를 들어, 메서드 매개 변수에 대한 기본 매개 변수로 사용할 수 있습니다), 그것은 것입니다 하지 당신이 그런 기술을 사용하는 경우 난독 수

static readonly

public static readonly string MyStr;

이다 런타임 상수. 이는 애플리케이션이 실행되기 전이 아니라 실행될 때 평가된다는 것을 의미합니다. 예를 들어 메서드 (컴파일 오류)의 기본 매개 변수로 사용할 수없는 이유입니다. 여기에 저장된 값은 난독 화 될 수 있습니다.


6

OQ는 static stringconst. 둘 다 서로 다른 사용 사례를 가지고 있습니다 (둘 다 정적으로 취급되지만).

const는 정말 일정한 값에만 사용하십시오 (예 : 빛의 속도-그러나 이것은 매체에 따라 다릅니다). 이 엄격한 지침의 이유는 const 값이이를 참조하는 어셈블리의 const 사용으로 대체되기 때문입니다. 즉, 정의 위치에서 const가 변경되면 버전 관리 문제가 발생할 수 있습니다 (즉, 상수가 아니어야 함). 아무튼). private const다른 어셈블리에 기본 및 하위 클래스가있을 수 있고 개인 필드가 상속 되기 때문에 이것은 필드 에도 영향을줍니다 .

정적 필드는 선언 된 유형에 연결됩니다. 주어진 유형의 모든 인스턴스에 대해 동일해야하는 값을 나타내는 데 사용됩니다. 이러한 필드는 원하는만큼 여러 번 쓸 수 있습니다 (읽기 전용으로 지정되지 않은 경우).

static readonlyvs 를 의미했다면 미래의 증거이기 때문에 거의 모든 경우에 const권장 static readonly합니다.


당신이 말하는이 "OQ"는 누구입니까?
Peter Mortensen

"원래 질문"
Ben Aston

0

당신은의 값을 변경할 수 있습니다 static readonly string단지에 static당신이 값은 변경할 수 없습니다 반면, 클래스 또는 변수 초기화의 생성자 const문자열 어디서나.


2
나는 이것이 기존 답변이 이미 말하는 것 이상으로 어떻게 추가되는지 보지 못합니다.
기금 모니카의 소송
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.