C #에서 const와 readonly의 차이점은 무엇입니까?


1362

C # const과 의 차이점은 무엇입니까 readonly?

언제 다른 것을 사용 하시겠습니까?


이 링크를 찾으려면 몇 가지 답변을 살펴 보았지만 좋은 결과입니다. C #에서 불변성에 에릭 Lippert의의 테이크
프랭크 브라이스

2
@donstack, 실제에있어서, C # 1 기준 , 판독 전용 필드에 할당 될 수 있으며 필드 선언 및 생성자 내에 여러 번 재.
Marques

답변:


1289

명백한 차이를 제외하고

  • constVS readonly값을 정의 할 때 값을 선언 해야하는 것은 동적으로 계산 될 수 있지만 생성자가 종료되기 전에 할당되어야합니다.
  • 'const 's는 암시 적으로 static있습니다. ClassName.ConstantName표기법을 사용 하여 액세스합니다.

미묘한 차이가 있습니다. 에 정의 된 클래스를 고려하십시오AssemblyA .

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyB 참조 AssemblyA코드에서 이러한 값을 하고 사용합니다. 이것이 컴파일되면

  • const값 의 경우 찾기 대치와 같으며 값 2는 ' AssemblyBIL에 '구워집니다 ' . 이는 내일이면 I_CONST_VALUE향후 20으로 업데이트 될 것임을 의미합니다 .AssemblyB내가 다시 컴파일 할 때까지 여전히 2가있을 것 입니다.
  • readonly값 의 경우 ref메모리 위치 와 같습니다 . 이 값은 AssemblyBIL에 구워지지 않습니다 . 즉, 메모리 위치가 업데이트 AssemblyB되면 재 컴파일하지 않고 새 값을 가져옵니다. 따라서 I_RO_VALUE30으로 업데이트 되면 빌드 만하면 AssemblyA됩니다. 모든 클라이언트를 다시 컴파일 할 필요는 없습니다.

따라서 상수 값이 변경되지 않을 것이라고 확신한다면 const .

public const int CM_IN_A_METER = 100;

그러나 변경 될 수있는 상수 (예 : 정밀도)가 있거나 의심스러운 경우을 사용하십시오 readonly.

public readonly float PI = 3.14;

업데이트 : Aku는 먼저 이것을 지적한 coz를 언급해야합니다. 또한 이것을 배운 곳에 꽂아야합니다. 효과적인 C #-Bill Wagner


77
static점은 가장 중요하고 유용한 점을 것 같다 -consts are implicitly static
LCJ

28
참조 값에 관한 부분이 가장 중요합니다. 상수 값을 최적화 할 수 있습니다.
CodingBarfield

22
readonly변수는 생성자 외부에서 변경할 수 있습니다 (반사). 생성자 외부에서 var를 수정하는 것을 방해하는 것은 컴파일러 일뿐입니다.
Bitterblue

12
@ mini-me readonly변수는 생성자가 리플렉션을 통해 완료된 후에는 변경할 수 없습니다. 런타임은 이것을 강제하지 않습니다. 런타임은 변경하지 않는 것이 시행하지 않는 일 string.Empty"Hello, world!",하지만, 난 여전히이하게 주장하지 않을 string.Empty수정, 또는 그 코드가 가정해서는 안 string.Empty항상 길이가 0 인 문자열이 될 것입니다.

7
blogs.msmvps.com/jonskeet/2014/07/16/… 흥미로운 것은 읽기 전용의 오버 헤드 비용입니다
CAD bloke

275

const가있는 문제가 있습니다! 다른 어셈블리에서 상수를 참조하면 해당 값이 호출 어셈블리로 바로 컴파일됩니다. 이렇게하면 참조 된 어셈블리에서 상수를 업데이트 할 때 호출 어셈블리에서 변경되지 않습니다!


8
디 컴파일 (리플렉터, ILSpy, ..)에서 동일한 어셈블리 나 다른 어셈블리에 관계없이 상수는 절대 참조되지 않으므로 컴파일 된 코드에서 상수의 사용을 전혀 분석 할 수 없습니다.
springy76

159

상수

  • 상수는 기본적으로 정적입니다
  • 컴파일 타임에 값을 가져야합니다 (예 : 3.14 * 2를 가질 수 있지만 메소드를 호출 할 수는 없습니다)
  • 함수 내에서 선언 가능
  • 그것들을 사용하는 모든 어셈블리에 복사됩니다 (모든 어셈블리는 로컬 값의 사본을 얻습니다)
  • 속성에서 사용 가능

읽기 전용 인스턴스 필드

  • 생성자가 종료 될 때까지 값을 설정해야합니다.
  • 인스턴스 생성시 평가

정적 읽기 전용 필드

  • 코드 실행이 클래스 참조에 도달 할 때 평가됩니다 (새 인스턴스가 작성되거나 정적 메소드가 실행될 때)
  • 정적 생성자가 완료 될 때까지 평가 된 값이 있어야합니다
  • 이것들에 ThreadStaticAttribute를 넣지 않는 것이 좋습니다 (정적 생성자는 하나의 스레드에서만 실행되며 스레드의 값을 설정합니다. 다른 모든 스레드는이 값을 초기화하지 않습니다)

58

추가하기 위해 참조 유형의 ReadOnly는 값이 아닌 참조 만 읽기 전용으로 만듭니다. 예를 들면 다음과 같습니다.

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};

  public UpdateReadonly()
  {
     I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
     I_RO_VALUE = new char[]{'V'}; //will cause compiler error
  }
}

string상수로 사용할 수있는 것 이외의 다른 참조 유형이 있습니까?
springy76

conststring 이외의 참조 유형을 가질 수 있지만 상수는 값만 가질 수 있습니다 null.
Mike Rosoft

40

이것은 그것을 설명합니다 . 요약 : const는 선언시 초기화되어야하며 읽기 전용은 생성자에서 초기화 될 수 있으므로 사용 된 생성자에 따라 다른 값을 가질 수 있습니다.

편집 : 미묘한 차이점은 위의 Gishu의 gotcha를 참조하십시오.


32

const: 어디서나 변경할 수 없습니다.

readonly:이 값은 생성자에서만 변경할 수 있습니다. 일반 기능에서는 변경할 수 없습니다.


26

읽기 전용의 작은 문제가 있습니다. 생성자 내에서 읽기 전용 필드를 여러 번 설정할 수 있습니다. 값이 두 개의 서로 다른 체인 생성자에 설정되어 있어도 여전히 허용됩니다.


public class Sample {
    private readonly string ro;

    public Sample() {
        ro = "set";
    }

    public Sample(string value) : this() {
        ro = value; // this works even though it was set in the no-arg ctor
    }
}

26

상수 멤버는 컴파일 타임에 정의되며 런타임시 변경할 수 없습니다. 상수는 const키워드를 사용하여 필드로 선언되며 선언 된대로 초기화해야합니다.

public class MyClass
{
    public const double PI1 = 3.14159;
}

readonly부재는 불변 값을 나타내는 것을 일정한 같다. 차이점은 readonly런타임시 생성자에서 멤버를 초기화 할 수 있으며 선언 된대로 초기화 할 수 있다는 것입니다.

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

const

  • 다음과 같이 선언 할 수 없습니다 static(내재적으로 정적 임).
  • 상수 값은 컴파일 타임에 평가됩니다
  • 상수는 선언시에만 초기화됩니다

읽기 전용

  • 인스턴스 수준이거나 정적 일 수 있습니다.
  • 값은 런타임에 평가됩니다.
  • 읽기 전용은 선언 또는 생성자의 코드로 초기화 할 수 있습니다

6
정적수 없으며 정적 일 수 있습니다. 선언 할 수 없음static const int i = 0;
nawfal

const메소드 내에서 선언을 할 수 없는지 설명 할 수 있습니까 ?
Minh Tran

21

const는 컴파일 타임 상수이지만 읽기 전용은 런타임에 값을 계산하고 생성자 또는 필드 이니셜 라이저에서 설정할 수 있습니다. 따라서 'const'는 항상 일정하지만 'readonly'는 일단 할당되면 읽기 전용입니다.

C # 팀의 Eric Lippert 는 다양한 유형의 불변성에 대한 자세한 정보를 제공합니다.


15

다음 은 const가 버전 안전하지 않거나 참조 유형과 관련이없는 방법을 보여주는 다른 링크 입니다.

요약 :

  • const 속성의 값은 컴파일 타임에 설정되며 런타임에 변경할 수 없습니다
  • Const는 정적으로 표시 할 수 없습니다. 키워드는 가능한 읽기 전용 필드와 달리 정적으로 나타냅니다.
  • Const는 value (primitive) 유형 이외의 다른 어떤 것도 될 수 없습니다
  • readonly 키워드는 필드를 변경할 수없는 것으로 표시합니다. 그러나 클래스의 생성자 내에서 속성을 변경할 수 있습니다
  • readonly only 키워드는 static과 결합하여 const와 같은 방식으로 작동하도록 할 수도 있습니다 (표면에서 가장 작은 것). 둘 사이의 IL을 보면 현저한 차이가 있습니다.
  • 읽기 전용이 "initonly"인 반면 const 필드는 IL에서 "literal"로 표시됩니다.

11

읽기 전용 : 런타임시 Ctor를 통해 값을 변경할 수 있습니다. 그러나 멤버 함수를 통하지 않음

상수 : 적분 정적. 어디에서나 값을 변경할 수 없습니다 (Ctor, Function, 런타임 등)


날을하지 주셔서 감사합니다 ... 단지이 두 테이크가는 요리 4 개 단락을 읽고
돈 치들에게


6

나는 const모든 객체에 대해 값이 동일하고 리터럴 표현식으로 초기화해야 한다고 생각 하지만 readonly각 인스턴스화마다 다를 수 있습니다 ...


5

사무실의 팀원 중 한 명이 const, static 및 readonly 사용시기에 대한 다음 지침을 제공했습니다.

  • const 사용런타임에 알 수있는 유형의 변수 (문자열 리터럴, int, double, 열거 형 등)가있을 때 하면 클래스의 모든 인스턴스 또는 소비자가 값을 변경해서는 안되는 곳에 액세스 할 수 있습니다.
  • 정적 사용클래스의 모든 인스턴스 또는 소비자가 값을 변경할 수있는 위치에 액세스 할 수있는 데이터가있는 경우 .
  • 런타임에 알 수없는 유형의 변수 (객체)가 있으면 클래스의 모든 인스턴스 또는 소비자가 값을 변경하지 않아야하는 위치에 액세스 할 수 있도록 하려면 정적 읽기 전용을 사용하십시오 .
  • 객체 생성시 변경되지 않아야 할 인스턴스 수준 변수가있는 경우 읽기 전용을 사용하십시오 .

마지막 메모 : const 필드는 정적이지만 그 반대는 아닙니다.


1
"대화"를 의미한다고 생각합니다. 반대의 경우는 "비 const 필드는 정적이 아닙니다"입니다. 사실 일 수도 있고 아닐 수도 있습니다. 반대로, "정적 필드는 (항상) const"가 아닙니다.
Michael Blackburn

5

둘 다 일정하지만 컴파일 타임에도 const를 사용할 수 있습니다. 이는 차이점의 한 측면은 const 변수를 속성 생성자에 대한 입력으로 사용할 수 있지만 읽기 전용 변수는 사용할 수 없다는 것입니다.

예:

public static class Text {
  public const string ConstDescription = "This can be used.";
  public readonly static string ReadonlyDescription = "Cannot be used.";
}

public class Foo 
{
  [Description(Text.ConstDescription)]
  public int BarThatBuilds {
    { get; set; }
  }

  [Description(Text.ReadOnlyDescription)]
  public int BarThatDoesNotBuild {
    { get; set; }
  }
}

5
  • 사용시기 const또는readonly

    • const

      • 컴파일 타임 상수 : 절대 상수, 선언 중에 값이 설정되고 IL 코드 자체에 있음
    • readonly

      • 런타임 상수 : 구성 파일 ie를 통해 생성자 / 초기화에서 설정할 수 App.config있지만 일단 초기화되면 변경할 수 없습니다

4

const로 표시된 변수는 강력한 형식의 #define 매크로에 지나지 않으며 컴파일시 const 변수 참조는 인라인 리터럴 값으로 대체됩니다. 결과적으로 특정 내장 기본 값 유형 만이 방식으로 사용될 수 있습니다. 읽기 전용으로 표시된 변수는 생성자에서 런타임에 설정할 수 있으며 해당 읽기 전용은 런타임 중에도 적용됩니다. 이와 관련된 약간의 성능 비용이 있지만 모든 유형 (참조 유형 포함)과 함께 읽기 전용을 사용할 수 있음을 의미합니다.

또한 const 변수는 본질적으로 정적 인 반면 읽기 전용 변수는 원하는 경우 인스턴스마다 다를 수 있습니다.


const는 강력한 #define macros 라고 덧붙였습니다 . 그렇지 않으면 모든 C 또는 C ++ 사람들을 놀라게 할 수 있습니다. :-)
Jason Baker

4

CONST

  1. const 키워드는 필드 또는 지역 변수에 적용될 수 있습니다
  2. 선언 할 때 const 필드를 할당해야합니다
  3. 할당 된 메모리 없음 컴파일 후 const 값이 IL 코드 자체에 포함되기 때문에. 그것은 모든 const 변수를 찾아 그 값으로 대체하는 것과 같습니다. 컴파일 후 IL 코드는 const 변수 대신 하드 코딩 된 값을 갖습니다.
  4. C #의 Const는 기본적으로 정적입니다.
  5. 값은 모든 객체에 대해 일정합니다
  6. dll 버전 문제가 있습니다-이것은 공용 const 변수 또는 속성을 변경할 때마다 (실제로 이론적으로 변경되지 않아야 함)이 변수를 사용하는 다른 dll 또는 어셈블리를 다시 빌드해야 함을 의미합니다
  7. C # 내장 형식 만 상수로 선언 할 수 있습니다
  8. Const 필드는 ref 또는 out 매개 변수로 전달 될 수 없습니다.

읽기 전용

  1. readonly 키워드는 지역 변수가 아닌 필드에만 적용됩니다
  2. 선언 할 때나 다른 메소드가 아닌 생성자에 읽기 전용 필드를 할당 할 수 있습니다.
  3. 읽기 전용 필드에 할당 된 동적 메모리이며 런타임시 값을 얻을 수 있습니다.
  4. 읽기 전용은 클래스 인스턴스를 통해서만 액세스 된 객체에 속합니다. 클래스 멤버로 만들려면 읽기 전용 전에 정적 키워드를 추가해야합니다.
  5. 사용 된 생성자에 따라 값이 다를 수 있습니다 (클래스의 객체에 속하므로)
  6. 기본이 아닌 유형 (참조 유형)을 읽기 전용으로 선언하면 포함 된 오브젝트가 아닌 참조 만 변경할 수 없습니다.
  7. 런타임시 값이 얻어 지므로 읽기 전용 필드 / 속성에 대한 dll 버전 관리 문제가 없습니다.
  8. 생성자 컨텍스트에서 읽기 전용 필드를 ref 또는 out 매개 변수로 전달할 수 있습니다.

3

또 다른 문제가 있습니다.

const는 실제로 기본 데이터 형식에서만 작동하므로 클래스로 작업하려는 경우 ReadOnly를 사용하도록 "강제로"느껴질 수 있습니다. 그러나 함정에주의하십시오! ReadOnly는 객체를 다른 객체로 교체 할 수 없음을 의미합니다 (다른 객체를 참조하도록 할 수는 없음). 그러나 객체를 참조하는 모든 프로세스는 내부 의 값을 자유롭게 수정할 수 있습니다. 의 !

따라서 ReadOnly가 사용자가 내용을 변경할 수 없음을 암시한다고 혼동하지 마십시오. C #에는 클래스의 인스턴스화가 내부 값이 변경되지 않도록하는 간단한 구문이 없습니다 (내가 아는 한).


그렇습니다. 더 일반적인 주제입니다. arraylist를 표시하는 get only 속성이있는 경우에도 여전히 arraylist를 수정할 수 있습니다. 해당 속성에 다른 배열 목록을 설정할 수는 없지만 사용자가 배열 목록을 변경하지 못하게 할 수는 없습니다.
Gishu

3

A는 const이어야 하드 코딩 된 곳으로, readonly생성자에 설정된 클래스.


3

C # .Net의 const 필드와 readonly 필드에는 눈에 띄는 차이가 있습니다.

const는 기본적으로 정적이며 상수 값으로 초기화해야하며 나중에 수정할 수 없습니다. 생성자에서도 값을 변경할 수 없습니다. 모든 데이터 유형에 사용할 수는 없습니다. 예를 들어, DateTime. DateTime 데이터 유형과 함께 사용할 수 없습니다.

public const DateTime dt = DateTime.Today;  //throws compilation error
public const string Name = string.Empty;    //throws compilation error
public readonly string Name = string.Empty; //No error, legal

읽기 전용은 정적으로 선언 될 수 있지만 필수는 아닙니다. 선언 할 때 초기화 할 필요가 없습니다. 생성자를 사용하여 값을 할당하거나 변경할 수 있습니다. 따라서 인스턴스 클래스 멤버로 사용될 때 이점을 제공합니다. 두 개의 다른 인스턴스화는 다른 값의 읽기 전용 필드를 가질 수 있습니다. 예를 들어-

class A
{
    public readonly int Id;

    public A(int i)
    {
        Id = i;
    }
}

그런 다음 다음과 같이 즉시 특정 값으로 읽기 전용 필드를 초기화 할 수 있습니다.

A objOne = new A(5);
A objTwo = new A(10);

여기서 인스턴스 objOne의 읽기 전용 필드 값은 5이고 objTwo의 값은 10입니다. const를 사용하면 불가능합니다.


2

상수는 리터럴 값으로 소비자에게 컴파일되는 반면 정적 문자열은 정의 된 값에 대한 참조로 사용됩니다.

연습으로 외부 라이브러리를 만들어 콘솔 응용 프로그램에서 사용하고 라이브러리의 값을 변경하고 다시 컴파일하십시오 (소비자 프로그램을 다시 컴파일하지 않고), DLL을 디렉토리에 드롭하고 EXE를 수동으로 실행하십시오. 상수 문자열은 변경되지 않습니다.


나는 그것이 진실한지 진심으로 의심한다. 나는 점검 할 것이다.
ljs

이것은 C #을 향상시키기위한 50 가지 구체적인 방법 중 하나입니다 -amazon.co.uk/Effective-Specific-Ways-Improve-Your/dp/0321245660/…
Russ Cam


@Andrew Hare-예, 방금 확인했습니다. 나는 매우 놀랐습니다, 그것은 진짜 문제입니다, 나는 정말 그것에 놀랐습니다.
ljs

그러나 여기서는 단어 포인터를 사용하는 것에 반대합니다. 그것은 참조의 포인터 아니라, 거기 이다 는 두 개의 구별하는 것이 중요합니다, 그래서 당신이 안전 모드에서 관리되지 않는 포인터를 조작 할 수있는 C #에서 차이.
ljs

2

일정한

const 필드가 정의 될 때 값을 const 필드에 제공해야합니다. 그런 다음 컴파일러는 상수 값을 어셈블리의 메타 데이터에 저장합니다. 이것은 boolean, char, byte 등과 같은 기본 유형에 대해서만 상수를 정의 할 수 있음을 의미합니다. 상수는 인스턴스 멤버가 아니라 항상 정적 멤버로 간주됩니다.

읽기 전용

읽기 전용 필드는 런타임시에만 해결할 수 있습니다. 즉, 필드가 선언 된 유형의 생성자를 사용하여 값의 값을 정의 할 수 있습니다. 컴파일러가 읽기 전용 필드를 생성자 이외의 다른 방법으로 쓰지 않는지 확인합니다.

이 기사에서 여기에 설명 된 두 가지에 대한 자세한 내용


1

주로; 런타임에는 정적 읽기 전용 필드에 상수가 아닌 값에 값을 할당 할 수 있지만 const에는 상수 값을 할당해야합니다.


1

Const와 readonly는 비슷하지만 정확히 동일하지는 않습니다. const 필드는 컴파일 타임 상수입니다. 즉, 컴파일 타임에 해당 값을 계산할 수 있습니다. 읽기 전용 필드를 사용하면 유형을 구성하는 동안 일부 코드를 실행해야하는 추가 시나리오가 가능합니다. 구성 후에는 읽기 전용 필드를 변경할 수 없습니다.

예를 들어 const 멤버를 사용하여 다음과 같은 멤버를 정의 할 수 있습니다.

struct Test
{
    public const double Pi = 3.14;
    public const int Zero = 0;
}

3.14 및 0과 같은 값은 컴파일 타임 상수이므로 그러나 유형을 정의하고 일부 사전 팹 인스턴스를 제공하려는 경우를 고려하십시오. 예를 들어, Color 클래스를 정의하고 Black, White 등과 같은 일반적인 색상에 "상수"를 제공 할 수 있습니다. 오른쪽이 컴파일 타임 상수가 아니기 때문에 const 멤버를 사용하여이 작업을 수행 할 수 없습니다. 일반 정적 멤버 로이 작업을 수행 할 수 있습니다.

public class Color
{
    public static Color Black = new Color(0, 0, 0);
    public static Color White = new Color(255, 255, 255);
    public static Color Red = new Color(255, 0, 0);
    public static Color Green = new Color(0, 255, 0);
    public static Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

그러나 Color의 클라이언트가 Black과 White 값을 바꾸어 그것과 어울리는 것을 막을 수는 없습니다. 말할 것도없이, 이것은 Color 클래스의 다른 클라이언트들에게 혼란을 야기 할 것입니다. "읽기 전용"기능은이 시나리오를 해결합니다. 선언에 단순히 readonly 키워드를 도입함으로써 유연한 초기화를 유지하면서 클라이언트 코드가 혼동되지 않도록합니다.

public class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);
    private byte red, green, blue;

    public Color(byte r, byte g, byte b) {
        red = r;
        green = g;
        blue = b;
    }
}

const 멤버는 항상 정적 인 반면, readonly 멤버는 일반 필드처럼 정적 일 수도 있고 그렇지 않을 수도 있습니다.

이 두 가지 목적으로 단일 키워드를 사용할 수 있지만 버전 문제 또는 성능 문제가 발생합니다. 우리가 이것을 위해 하나의 키워드를 사용했다고 가정하고 개발자는 다음과 같이 썼습니다.

public class A
{
    public static const C = 0;
}

다른 개발자가 A에 의존하는 코드를 작성했습니다.

public class B
{
    static void Main() {
        Console.WriteLine(A.C);
    }
}

이제 생성 된 코드가 AC가 컴파일 타임 상수라는 사실에 의존 할 수 있습니까? 즉, AC 사용을 단순히 값 0으로 대체 할 수 있습니까? "예"라고 대답하면 A 개발자가 AC 초기화 방식을 변경할 수 없음을 의미합니다. 이는 A 개발자의 권한을 무단으로 묶습니다. 이 질문에 "아니오"라고 말하면 중요한 최적화가 빠집니다. 아마도 A의 저자는 AC가 항상 0 일 것이라고 긍정적입니다. const와 readonly를 모두 사용하면 A 개발자가 의도를 지정할 수 있습니다. 따라서 버전 관리 동작이 향상되고 성능이 향상됩니다.


1

ReadOnly :이 값은 클래스의 생성자에서 한 번만 초기화됩니다.
const : 모든 함수에서 초기화 할 수 있지만 한 번만 초기화 할 수 있습니다


1

차이점은 정적 읽기 전용 필드의 값이 런타임에 설정되므로 프로그램 실행마다 다른 값을 가질 수 있다는 것입니다. 그러나 const 필드의 값은 컴파일 시간 상수로 설정됩니다.

알아두기 : 두 경우 모두 (정적 및 인스턴스) 참조 유형의 경우 읽기 전용 수정자는 필드에 새 참조를 할당하지 못하도록합니다. 구체적으로 참조로 가리키는 객체를 변경할 수 없습니다.

자세한 내용은이 항목에 대한 C # FAQ ( http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx) 를 참조하십시오.


1

상수 변수는 컴파일 타임에 선언되고 초기화됩니다. 병동 후에는 값을 변경할 수 없습니다. 읽기 전용 변수는 클래스의 정적 생성자에서만 초기화됩니다. 읽기 전용은 런타임에 값을 할당하려는 경우에만 사용됩니다.


1

Const : 응용 프로그램 수명 동안 절대 상수 값입니다.

읽기 전용 : 실행 시간에 변경할 수 있습니다.


1
변경할 수있는 '읽기 전용'에 대한 정의에 결함이 있습니다. '변경'으로 '런타임에서 설정할 수 있습니다'와 같은 '설정'을 의미한다고 생각합니다.
Ahmed

0

사람들이 위에서 말한 것에 추가해야 할 한 가지. 읽기 전용 값을 포함하는 어셈블리가있는 경우 (예 : readonly MaxFooCount = 4;), 다른 버전으로 해당 어셈블리의 새 버전을 배송하여 호출 어셈블리가 보는 값을 변경할 수 있습니다 (예 : readonly MaxFooCount = 5;)

그러나 const를 사용하면 호출자가 컴파일 될 때 호출자의 코드로 접 힙니다.

이 수준의 C #에 도달하면 Bill Wagner의 저서 효과적인 C # : C #을 향상시키는 50 가지 방법 (이 49 가지 질문에 자세히 설명되어 있음)에 대한 준비가 된 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.