const
와 readonly
유사하지만 정확히 동일하지 않습니다.
const
필드는 그 값은 컴파일 시간에 계산 될 수 있다는 것을 의미 컴파일 시간 상수이다. readonly
필드는 몇 가지 코드 유형의 건설 기간 동안 실행해야하는 추가 시나리오를 가능하게한다. 시공 후 readonly
필드를 변경할 수 없습니다.
예를 들어, 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, green, blue) = (r, g, b);
}
그러나 색상의 클라이언트가 흑백 값을 교환하여 색상 클라이언트를 막을 수있는 것은 없습니다. 말할 것도없이, 이것은 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, green, blue) = (r, g, 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 개발자가 의도를 지정할 수 있습니다. 따라서 버전 관리 동작이 향상되고 성능이 향상됩니다.
static readonly
. 내부에서 const를 사용IEnumerator
하면 복구 할 수없는 트리거가 발생하여yield
"내부 컴파일러 오류"가 두려워 집니다. Unity3D 외부에서 코드를 테스트하지는 않았지만 이것이 모노 또는 .NET 버그라고 생각 합니다. 그것은이다 C #을 그럼에도 불구하고 문제가있을 수 있습니다.