블로그 이미지
따뜻한 코드 만들기 리본매냐

카테고리

분류 전체보기 (34)
.NET (6)
Database (5)
Daily life (11)
세미나 후기 (0)
마음의 지식 (7)
코드 (1)
Python (1)
외출 (3)
Total
Today
Yesterday

달력

« » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

공지사항

태그목록

최근에 올라온 글

// 컴파일 타임 상수
public const int _Millennium = 2000;
// 런타임 상수
public static readonly int _ThisYear = 2011;

컴파일타임 상수를 이용하면 컴파일 시 상수형 변수가 사용되는 위치가 실질적인 값으로 치환된다.
if (myDatatime.Year == 2000)

반면 런타임 상수는 수행시 평가된다. 상수에 대한 참조자가 위치한다.
이러한 특성으로 컴파일타임 상수는 단지 내장자료형(정수형, 실수형 등) 이나 enum, string에 대해서만 사용된다.

readonly는 어떤 자료형으로도 선언이 가능하며, readonly 상수를 포함하는 타입의 생성자나 선언시 초기화 방법을 이용하여 값을 초기화 할 수 있다.
DateTime 구조체형의 readonly 상수는 정의할 수 있으나, const 상수는 정의 할 수 없다.

또한, readonly는 타입의 인스턴스 별로 서로 다른 값을 가질 수 있으나 const 상수는 기본적으로 항상 static이므로 항상 동일한 값만을 가질 수 있다.

예)
public class UsefulValues
{
       public static readonly int StartValue = 5;
       public const int EndValue = 10;
}

다른 어셈블리에서 아래와 같이 참조한다.
for (int i = UsefulValues.StartValue; i < UsefulValues.EndValue; i++)
{
          Console.WriteLine("Value is {0}", i);
 }

결과)
Value is 5
Value is 6
...
Value is 9


시간이 지나 새로운 버전을 다음과 같이 수정하였다.

public class UsefulValues
{
       public static readonly int StartValue = 101;
       public const int EndValue = 120;
}
다음과 같은 결과를 바랄 것이다
Value is 101
Value is 102
...
Value is 120
하지만 아무것도 나오지 않는다.

C# 컴파일러는 const필드에 대해 reference 대신에 값 그 자체를 대체한다. EndValue의 값은 여전히 9!!
반면, readonly는 수행시까지 참조자를 유지하며, 참조시점에 값으로 평가된다.

const 값이 바뀌는 경우에는 모든 어셈블리에 대해서 재컴파일을 수행해야 한다. 하지만 reaonly 형으로 정의된 상수의 값이 바뀌는 경우는 단순히 변경된 어셈블리만을 컴파일하여 배포하여도 이진 호환성은 유지된다.
const는 컴파일 시에 값으로 평가되어야 하는 곳에서만 사용되어야 한다. 
Posted by 리본매냐
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함