C#의 개인 Const와 Private Readonly 변수 사이에 차이가 있습니까?

StackOverflow https://stackoverflow.com/questions/410723

  •  03-07-2019
  •  | 
  •  

문제

a private const 변수 또는 a private static readonly c#의 변수 (지정하지 않는 것 외에는 const 컴파일 타임 표현)?

그것들은 모두 비공개이므로 다른 라이브러리와 연결되지 않습니다. 그렇다면 어떤 차이가 있습니까? 예를 들어 성능 차이를 만들 수 있습니까? 인턴 된 현? 비슷한 것이 있습니까?

도움이 되었습니까?

해결책

글쎄, 당신은 컴파일 시간으로 존재하기 때문에 목자를 속성으로 사용할 수 있습니다. 정적 판독 변수의 값을 예측할 수 없습니다. .cctor 구성 등에서 초기화 할 수 있습니다.

사용 측면에서 상수는 호출 코드로 태워집니다. 이것은 당신이 다시 컴파일하는 경우 a를 의미합니다 도서관 DLL을 변경합니다 공공의 일정하지만 소비자를 바꾸지 않으면 소비자는 여전히 원래 가치를 사용합니다. Readonly 변수에서는 이런 일이 발생하지 않습니다. 이것의 플립은 상수가 단순히 값을로드하지 않고 단순히 값을로드하기 때문에 (매우, 매우 약간) 더 빠릅니다.

다시 인턴; 이 작업을 수동으로 수행 할 수 있지만 가장 일반적으로 리터럴의 컴파일러/런타임 기능입니다. 문자를 통해 준비된 필드를 시작한 경우 :

someField = "abc";

그럼 "abc" 인턴이 될 것입니다. 구성에서 읽으면 그렇지 않습니다. 일정한 문자열은 문자 그대로이어야하기 때문에 인턴이되지만 다르게 액세스합니다. 다시 말하지만, 필드에서 읽는 것은 회의가 아니라 참조입니다. ldstr.

다른 팁

실제로, 두 유형은 초기화 된 후에는 변경할 수 없지만 그 사이에는 몇 가지 차이점이 있습니다.

  • 'const'는 선언 된 곳에 (컴파일 시간에) 초기화되어야하는 반면, 'Readonly'는 선언 된 위치에 또는 생성자 내부 (AR 런타임)를 초기화 할 수 있습니다.

예를 들어이 상황에서는 const를 사용할 수 있습니다.

public class MathValues
{
  public const double PI = 3.14159;
}

그리고이 경우에도 더 나은 것입니다.

public class Person
{
    public readonly DateTime birthDate;

    public Person(DateTime birthDate)
    {
        this.birthDate = birthDate;
    }
}

또는

public class Person
{
    public readonly DateTime birthDate = new DateTime(1986, 1, 24);
}
  • 'const'는 정적이므로 해당 클래스의 모든 인스턴스간에 공유되며 (MathValues.pi와 같은) 직접 액세스 할 수 있지만 'Readonly'는 정적이 아닙니다. 결과적으로 'static const'와 같은 선언은 const가 정적이기 때문에 불법이지만 '정적 리디 론적'은 합법적입니다.

  • 'const'는 적분 유형 (sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, bool, bool 또는 string), 열거 또는 null에 대한 참조 (클래스가 아님 또는 '새'키워드와 함께 런타임에 초기화되기 때문에 구조, 'readonly'는 복잡한 유형, 구조 또는 클래스를 보유 할 수 있지만 (초기화시 새 키워드를 사용하여) 열거는 유지할 수 없습니다.

상수에 대해 주목할만한 것은 실제로 실행 파일에 저장되어 있으므로 많은 것을 선언합니다. ~ 할 것이다 실행 파일 크기를 늘리십시오.

일반적으로 이것은 큰 문제는 아니지만, 내 친구는 회사에서 일한 "모든 것이 콘트라스"규칙이어야하고 컴파일 된 실행 가능한 크기를 크게 늘릴 수있었습니다.

C# .NET의 차이점은 다음과 같습니다 Const, 준비 적 그리고 정적으로 읽기 필드 (From 이 기사).

상수:

  • 기본적으로 정적
  • 컴파일 타임 값이 있어야합니다 (예 : "a"+"b"를 가질 수 있지만 메소드 호출을 할 수는 없습니다).
  • 속성에서 사용할 수 있습니다
  • 이를 사용하는 모든 어셈블리에 복사됩니다 (모든 어셈블리는 로컬 값 사본을 얻습니다)
  • 기능 내에서 선언 할 수 있습니다

Readonly 인스턴스 필드:

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

정적 판독 필드:

  • 코드 실행이 클래스 참조를 누르면 평가됩니다 (예 : 새 인스턴스가 생성되거나 정적 메소드가 실행됩니다)
  • 정적 생성자가 완료 될 때까지 값을 평가해야합니다.
  • 당신은 실제로 이것들에 threadStaticAttribute를 넣고 싶지 않습니다 (정적 생성자는 하나의 스레드에서만 실행되며 스레드에 대한 값을 설정하기 때문에 다른 모든 스레드는이 값을 초기화되지 않습니다).

사이에는 주목할만한 차이가 있습니다 Const 그리고 준비 적 c#.net의 필드

Const는 기본적으로 정적이며 일정한 값으로 초기화되어야하며 나중에 수정할 수 없습니다. 생성자에서도 가치 변경도 허용되지 않습니다. 모든 데이터 타입과 함께 사용할 수는 없습니다. 시간 시간 동안. DateTime Datatype에서 사용할 수 없습니다.

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

Readonly는 정적으로 선언 할 수 있지만 필요하지 않습니다. 선언 당시 초기화 할 필요가 없습니다. 생성자를 사용하여 값을 할당하거나 변경할 수 있습니다. 따라서 인스턴스 클래스 멤버로 사용하면 이점을 제공합니다. 두 가지 다른 인스턴스화는 다른 값의 값을 가질 수 있습니다. Ex-

class A
{
    public readonly int Id;

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

그런 다음 Readonly 필드는 다음과 같이 즉각적인 특정 값으로 초기화 될 수 있습니다.

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

여기서 OBJONE은 5로 ReadOnly 필드의 가치를 가지며 Objtwo는 10을 가지고 있습니다. Const를 사용하면 불가능합니다.

사용? 설마. CONSS는 컴파일 시간에 평가되는 반면, ReadOnly는 런타임에 평가됩니다. 생성자에 readonly 변수 A 값을 할당 할 수도 있습니다.

하나 더. 위의 의견에서 이것을 보지 못했지만 놓쳤을 수도 있습니다. 일정한 배열을 만들 수 없습니다.

private const int[] values = new int[] { 1, 2, 3 };

하지만 당신 ~할 수 있다 정적 리드 폰리 필드를 사용하여 작성하십시오.

private static readonly int[] values = new int[] { 1, 2, 3 };

따라서 허용 값 목록과 같은 배열 상수가 필요하고 열거가 적절하지 않으면 정적 리디력이 유일한 방법입니다. 예를 들어, 배열이 다음과 같이 무효 정수 인 경우 :

private static readonly int?[] values = new int?[] { null, 1, 2, 3 };

할 수 없습니다 저것 일정한 일과 함께 할 수 있습니까?

차이점은 정적 리디 폰리 필드의 값이 실행 시간에 설정되어 포함 된 클래스에 의해 수정 될 수있는 반면, const 필드의 값은 컴파일 시간 상수로 설정된다는 것입니다.

정적 판독 된 경우, 포함 된 클래스는이를 수정할 수 있습니다.

정적 생성자 (정적이 아닌 경우 인스턴스 생성자)의 변수 선언 (변수 이니셜 라이저를 통한)에서 정적 판독 론적으로 필드 유형이 const 선언에서 허용되지 않거나 값이 알려지지 않은 경우에 일반적으로 사용됩니다. 시간을 컴파일하십시오.

인스턴스 readonly 필드도 허용됩니다.

참조 유형의 경우 두 경우 (정적 및 인스턴스)에서 Readonly 수정자는 필드에 대한 새로운 참조를 할당하는 것을 방지합니다. 그것은 구체적으로 참조에 의해 지적한 대상을 불변으로 만들지 않습니다.

class Program

{

  public static readonly Test test = new Test();

  static void Main(string[] args)

  {

     test.Name = "Program";

     test = new Test(); // Error: A static readonly field cannot be assigned to (except in a static constructor or a variable initializer)

  }

}

class Test

{

   public string Name;

}

차이점은 포함 된 클래스에 의해 정적 읽기 전용을 수정할 수 있지만 const를 수정할 수 없으며 컴파일 시간 상수로 초기화되어야한다는 것입니다. 정적 읽기 전용 케이스를 약간 확장하려면 포함 된 클래스는이를 수정할 수 있습니다.

- 변수 선언에서 (변수 이니셜 라이저를 통해).

- 정적 생성자 (정적이 아닌 경우 인스턴스 생성자)에서.


c# .net의 const 키워드

예시: public const string abc = “xyz”;선언에서만 초기화되었습니다. 값은 컴파일 시간에 평가되며 실행 시간에 변경할 수 없습니다. 변경하려는 시도는 컴파일 오류가 발생합니다. Const는 이미 정적입니다. 클래스와 structs는 새로운 키워드로 실행 시간에 초기화되므로 클래스 나 구조에 상수를 설정할 수 없습니다. 그러나 그것은 적분 유형 중 하나 여야합니다. C# .NET의 ReadOnly 키워드

예시: public readonly string abc;선언 코드 또는 CORTURCTOR 코드에서 초기화 할 수 있습니다. 값은 실행 시간에 평가됩니다. 정적 또는 인스턴스 레벨 속성으로 선언 할 수 있습니다. 읽기 전용 필드는 실행 시간에 새 키워드를 사용하여 복잡한 객체를 보유 할 수 있습니다.

Readonly 필드는 초기화 될 수 있습니다 선언 또는 a 건설자 수업의. 따라서 준비된 필드 사용 된 생성자에 따라 다른 값을 가질 수 있습니다.

Readonly 회원도 가능합니다 런타임 상수에 사용됩니다 다음 예에서와 같이 :

public static readonly uint currentTicks = (uint)DateTime.Now.Ticks;

Readonly Fields입니다 ~ 아니다 암시 적으로 정적이므로 정적 키워드 필요한 경우 명시 적으로 명시 적으로 현장 필드에 적용 할 수 있습니다. 이것은 내재적으로 정적 인 const 필드에 허용되지 않습니다.

Readonly 멤버는 사용하여 복잡한 개체를 보유 할 수 있습니다 초기화시 새로운 키워드.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top