(1) readonly와 const는 모두 상수를 표시하는 데 사용됩니다.
(2) 초기화 할당이 다릅니다.
const로 수정된 const는 선언과 동시에 값을 할당받아야 합니다. 예를 들어
public class Class1 { public const int MaxValue = 10; //正确声明 public const MInValue; //错误:常量字段要求提供一个值 public Class1() { MinValue = 10; } }
읽기 전용 필드는 초기화(선언 또는 생성자) 중에 할당될 수 있습니다. 따라서 읽기 전용 필드는 사용된 생성자에 따라 다른 값을 가질 수 있습니다.
public class Class1 { public readonly int c = 10; //正确声明 public readonly int z; public Class1() { z = 24;//正确 } protected void Load() { z = 24;//错误:无法对只读的字段赋值(构造函数或变量初始值指定项中除外) } }
readonly는 인스턴스 멤버이므로 인스턴스마다 서로 다른 상수 값을 가질 수 있으므로 읽기 전용이 더 유연해집니다.
public readonly Color Red = new Color(255, 0, 0); public readonly Color Green = new Color(0, 255, 0); public readonly Color Blue = new Color(0, 0, 255);
(3) const 필드는 컴파일 타임 상수인 반면, 읽기 전용 필드는 런타임 상수로 사용될 수 있습니다.
const를 사용하려면 컴파일러가 컴파일 타임에 특정 값을 계산할 수 있어야 합니다. 컴파일 타임에 상수가 호출되는 모든 위치는 계산된 값으로 대체됩니다. 따라서 상수를 초기화하기 위해 변수에서 값을 추출할 수 없습니다.
읽기 전용을 사용하면 필드를 상수로 설정할 수 있지만 일부 작업을 수행하고 초기 값을 결정할 수 있습니다. readonly는 계산 시 실행되기 때문에 특정 변수로 초기화될 수 있습니다. 이 값은 런타임 시 결정됩니다.
(4) const는 기본적으로 static이며, static으로 설정된 경우 readonly를 명시적으로 선언해야 합니다.
(5) const로 수정되는 값의 유형도 sbyte, byte, short, ushort, int, uint, long 유형 중 하나만 가능합니다. , ulong, char, float, double,decimal, bool, string, enum 유형 또는 참조 유형. const로 선언할 수 있는 참조 유형은 문자열이거나 값이 null인 기타 참조 유형만 가능합니다. 읽기 전용은 모든 유형이 될 수 있습니다.
즉, const 상수가 필요할 때 해당 유형으로 인해 컴파일 타임에 명확한 값을 계산할 수 없는 경우 이를 정적 읽기 전용으로 선언하여 문제를 해결할 수 있습니다. 그러나 둘 사이에는 여전히 약간의 차이가 있습니다. 아래 두 가지 다른 문서를 살펴보십시오.
file1.cs
using System; namespace MyNamespace1 { public class MyClass1 { public static readonly int myField = 10; } }
file2.cs
namespace MyNamespace2 { public class MyClass1 { public static void Main() { Console.WriteLine(MyNamespace1.MyClass1.myField); } } }
두 클래스는 file1.cs와 file2.cs 두 파일에 속하며 별도로 컴파일됩니다. file1.cs 파일의 myField 도메인이 정적 읽기 전용으로 선언된 경우, 필요에 따라 myField 값을 20으로 변경하면 file2를 실행할 때 file1.cs 파일을 file1.dll로 다시 컴파일하기만 하면 됩니다. exe 즉, 20을 얻게 됩니다.
그러나 정적 읽기 전용을 const로 변경한 다음 myField의 초기화 값을 변경하면 file1.dll을 참조하는 모든 파일을 다시 컴파일해야 합니다. 그렇지 않으면 우리가 참조하는 MyNamespace1.MyClass1.myField가 예상대로 변경되지 않습니다. . 이는 대규모 시스템을 개발하는 동안 주의를 기울이는 것이 특히 중요합니다.
(6) 객체, Array(배열) 및 struct(구조체)는 const 상수로 선언할 수 없습니다.
위 내용은 c#.net의 const와 readonly의 차이점입니다. 자세한 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!