문제

의 차이는 무엇입 constreadonly 그리고 당신은 중 하나를 사용하니까?

도움이 되었습니까?

해결책

그 외에도에서의 명백한 다름

  • 을 선언하는 가치는 시간에 대한 정의 constreadonly 값을 계산할 수 있는 동적으로만 필요로 할당되기 전에 생성자를 종료..그 후 그것은 냉동입니다.
  • 'const 는 암시적으로 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 references AssemblyA 고 사용하여 이 값에 코드입니다.이 컴파일

  • 의 경우에는 const 가치,그것을 찾을 바꾸기 값 2 는'구운로 AssemblyB아 IL.즉,이 경우 내일 업데이트 I_CONST_VALUE 20 다. AssemblyB 여전히 남아 있었 2 까 나는 다음과 같이 다시 컴파일합니다.
  • 의 경우에는 readonly 값은 다음과 같 a ref 하는 메모리 위치에 있습니다.값이 없는 구운로 AssemblyB아 IL.즉,이 경우에는 메모리 위치를 업데이트 AssemblyB 져오는 새로운 값을 다시 컴파일하지 않고.그래서 만약 I_RO_VALUE 입 업데이트 30,당신은 단지 구축 AssemblyA.모든 클라이언트가 다시 컴파일해야 합니다.

그래서 만약 당신이 자신감하는 상수의 값을 변경되지 않는다 사용 const.

public const int CM_IN_A_METER = 100;

하지만 당신은 일정한 변경할 수 있는(예를 들어w.r.t.정밀)..또는 의심,사용 readonly.

public readonly float PI = 3.14;

업데이트:Aku 를 얻기 위해 필요 언어는 지적이 처음이다.또한 내가 필요로 연결하는 것을 배웠습니다.. 효과적인 C#빌 Wagner

다른 팁

가 있으로 잡았다 consts!를 참조하는 경우에는 일정한 다른 어셈블리에서 해당 값이 컴파일한 오른쪽으로 호출하면 어셈블리입니다.는 방법으로 할 때 지속적인 업데이트에서 참조하는 어셈블리는 그것을 변경하지 않습니다에서 호출하면 어셈블리!

상수

  • 상수가 기본적으로 정적
  • 그들은 값이 있어야에서 컴파일 시간(할 수 있는 예를 들어,3.14*2,하지만 호출할 수 없습 방법)
  • 수 내에 선언된 함수
  • 로 복사되는 모든 어셈블리는 그들을 사용(어셈블리를 가져오는 지역의 사본값)
  • 에서 사용할 수 있습 특성

Readonly 인스턴스 분야

  • 이 있어야 합 설정 값에 의해 시 생성자를 종료
  • 평가할 때 인스턴스를 만듭니다

Static readonly 분야

  • 평가할 수 있는 코드는 실행중 클래스에 참조(을 때 새 인스턴스를 만들거나 정적 방법은행)
  • 가 있어야 평가가 가치에 의하여 시간에 정적 생성자가 수행
  • 그것은 권장하지 않음을 넣어 threadstaticattribute 로에서 이러(static 생성자를 실행됩에서 하나의 스레드로만 설정 값에 대한 그것의 실;모든 다른 스레드가 이 값을 초기화되지 않음)

을 추가,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
  }
}

이 설명.요약:const 초기화해야 합니다에 선 시간,readonly 초기화할 수 있습에서 생성자(따라서 다른 값으로 생성자에 따라 사용).

편집:보 Gishu 의 잡았다 위를 위한 미묘한 차이

const:변경할 수 없다.

readonly:이 값을 변경할 수 있습에서 생성자입니다.에서 변경할 수 없습니다 정상적인 기능입니다.

거기에 작은 잡았다 함께 읽기 전용입니다.Readonly 필드를 설정할 수 있는 여러 시간에서 생성자를(s).는 경우에도 이 값으로 설정에 두 개의 서로 다른 생성자를 연결은 그것은 계속 수행할 수 있습니다.


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
    }
}

상수원에서 정의 컴파일 시간과 변경할 수 없습니다.상수로 선언된 필드를 사용하여, const 키워드 초기화해야 합니다 그들은 선언합니다.

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

A readonly 회원은 일정한에서는 나타내는 변하지 않는 값입니다.된다는 차이점이 readonly 멤버 초기화할 수 있습 런타임 시에서 생성자뿐만 아니할 수 있는 초기화로 그들은 선언합니다.

public class MyClass1
{
     public readonly double PI2 = 3.14159;

     //or

     public readonly double PI3;

     public MyClass2()
     {
         PI3 = 3.14159;
     }
}

const

  • 그들은 할 수 없으로 선언 static (그들은 암시적으로 정적)
  • 상수 값을 평가에서 컴파일 시간
  • 상수 초기화에서만 선언

readonly

  • 그들 중 하나가 될 수 있습 인스턴스 레벨 또는 정적
  • 가치 평가에서 실행 시간
  • readonly 에서 초기화할 수 있습니다 또는 선언의 코드에 의해 생성자

Const 은 컴파일 시간 상수는 반면 readonly 허용 값을 계산할 수은 실행시 설정에서 생성자 또는 필드의 이니셜라이저입니다.그래서,'const'은 항상 일정'readonly'읽기 전용입니다면 그것은 할당됩니다.

에릭 프라하 C#팀은 더 많은 정보에 다른 유형의 면역성

여기에 또 다른 링크 는 방법을 보여주는 const 지 않은 버전을 안전하거나 관련 참고를 위한 형식입니다.

요약:

  • 의 가치 const 속성을 설정하면 컴파일시 및 변경할 수 없습니에타
  • Const 할 수 없으로 표시 정체되는 키워드를 나타낸 그들은 정전과는 달리,readonly 필드를 할 수 있습니다.
  • Const 할 수 없습외의 값(원)유형
  • Readonly 키워드를 표시장으며 변경될 수 없습니다.그러나의 속성을 변경할 수 있습 내부 클래스의 생성자
  • Readonly 만 키워드 결합할 수도 있습으로 정적 그것을 행동으로 같은 방식으로 const(어 표면에).표시되어 있는 차이점에서 볼 때 IL 사이의 두 개의
  • const 필드 표시로"문자"일하는 동안 읽기 전용입니다"initonly"

만 읽 :값을 변경할 수 있습을 통해 Ctor 을 수 있습니다.지를 통해 구성원 기능

일정 :에 의해 시급한 과 정적입니다.값을 변경할 수 없습니다 어디에서나(Ctor,기능,런타임 등 no-where)

아직 다른 잡았다:readonly 값을 변경할 수 있습으로"악"를 통해 코드를 반영합니다.

var fi = this.GetType()
             .BaseType
             .GetField("_someField", 
                       BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);

을 변경할 수 있습니 전용 읽기 전용 상속된 필드를 사용하여 C#에서까?

const 값은 같은 모든 물체(와 초기화해야 합니다와 그대로 표현),반면 readonly 각각에 대해 서로 다를 수 있습니다 인스턴스화...

하나의 팀 구성원이 우리의 사무실에서 제공되는 다음에 대한 지침을 사용하는 경우 const,정전,readonly:

  • const 이 있을 때 변수의 형식을 알 수 있습 런타임(literal string,int,더블,왜냐하면,...)는 당신이 원하는 모든 경우 또는 소비자의 클래스에 액세스하는 값은 변경되지 않습니다.
  • static 할 때는 데이터는 당신이 원하는 모든 경우 또는 소비자의 클래스에 액세스하는 값을 변경할 수 있습니다.
  • static readonly 이 있을 때 변수는 형식의 알 수 없습 런타임(객체)를 원하는 모든 경우 또는 소비자의 클래스에 액세스하는 값은 변경되지 않습니다.
  • readonly 이 있을 때 인스턴스 레벨 변수는 당신이 알고있는 시간에 객체를 작성해야 하는 변경되지 않습니다.

마지막 주의:const 필드는 정적이지만,역가 사실이 아닙니다.

그들은 모두 일정하지만,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; }
  }
}

변수를 표시 const 보다 조금 더 강하게 입력하#정의 매크로,컴파일 시 const 변수를 참조로 대체 인라인 리터럴 값입니다.결과적으로 특정이 기본 제공되는 가치 유형을 사용할 수 있습니다.표시 된 변수를 읽기 전용 설정할 수 있습니다,에서 생성자를 실행하고 그들의 읽기 전용 ness 을 적용하는 동안 실행한 시간이 주어집니다.거기에 몇 가지 작은 성능과 관련된 비용이지만 그것은 사용할 수 있음을 의미 읽기 전용으로 모든 유형(도 유형을 참조).

또한,const 변수는 본질적으로 정적 하는 반면 변수를 읽기 전용될 수 있 인스턴스의 특정 원하는 경우.

또 다른 잡았다.

이후 const 동으로 기본적인 데이터 유형,작업하려는 경우 와 클래스에,당신은 느낄 수 있습니다"강제적인"를 사용 읽기 전용입니다.그러나,주의 트랩!ReadOnly 수 있다는 것을 의미한 대체하지 않는 객체로 다른 물체(할 수 없습니다 그것을 참조하는 또 다른 목).하지만 모든 과정에 있는 객체에 대한 참조 무료로 값을 수정할 수 있습니다 니다.

그래서 할 수 없이 혼란으로 생각하는 ReadOnly 을 의미한 사용자는 변경할 수 없는 것들입니다.거기에 간단한 구문에서는 C#를 방지하기 위해 인스턴스화의 클래스에서는 내부 값을 변경(지금까지 내가 알고).

이 주목할 만한 차이 const 및 readonly 분야에서 C#.Net

const 은 기본적으로 정적 및 초기화해야 한다는 사실과 함께 일정한 값을 수정할 수 없습니다.변경의 가치가 허용되지 않습에서 생성자,too.그것과 함께 사용할 수 없습니다 모든 데이터 형식.Ex-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

readonly 선언할 수 있습으로 정적이지만,필요하지 않습니다.를 초기화 할 필요가 시점에서의 선언입니다.그 값을 할당하거나 변경되었을 사용하여 생성자입니다.그래서,그것은 장점 때 사용으로 인스턴스 클래스 구성원입니다.두 개의 서로 다른 인스턴스화할 수 있는 다른 값 읽기 전용 분야이다.Ex-

class A
{
    public readonly int Id;

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

다음 읽기 전용 분야 초기화 인스턴트에 특정 값을 다음과 같다:

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

여기에 인스턴스 objOne 이의 값을 읽기 전용 분야로 5objTwo10.지를 사용하여 가능한 상수.

일정한 것으로 컴파일한 방법으로 이용자 리터럴 가치는 동안 정적 문자열을 참고 값으로 정의됩니다.

운동으로 시도를 만들은 외부 라이브러리와에서 소비를 콘솔 프로그램,그 값을 변경 라이브러리에서 다음과 같이 다시 컴파일합니다(다시 컴파일하지 않고 소비자는 프로그램),드롭 DLL 디렉토리로 실행 EXE 수동으로 찾아야 합니하는 일정한 문자열 변경되지 않습니다.

일정

우리를 제공해야하는 값을 const 필드 할 때 그것은 정의됩니다.컴파일러는 다음을 저장 상수의 값을 어셈블리에서의 메타데이터가 포함되어 있습니다.이 의미는 상수 정의할 수 있에 대해서만 기본 형식과 같은 부울,char,바이트다.상수은 항상 정적 멤버지 인스턴스의 멤버입니다.

Readonly

Readonly 필드를 해결할 수 있습니다.즉 우리가 할 수 있을 정의한 값을 사용하여 값을 생성자를 위한 유형에서는 필드를 선언합니다.검증가에 의해 수행하는 컴파일러를 읽기 전용 분야에 기록되지 않을 통해 어떤 이외의 다른 방법을 생성자입니다.

더 많은 모두에 대 여기에 설명되어에서 이 문서

CONST

  1. const 키워드를 적용할 수 있는 분야 또는 지역 변수
  2. 우리는 할당해야 합 const 분야에서의 시간을 선언
  3. 더 메모리 할당되기 때문에 상수 값에 포함 IL 코드 자체 후 컴파일할 수도 있습니다.그것은 모든 항목을 찾을 수 const 변수를 교체해 그것의 값입니다.그래서 IL 코드를 컴파일해야 하드 코딩된 값이 장소에서의 변수 const
  4. Const C#에서는 기본적으로 정적입니다.
  5. 이 값은 일정한 모든 개체에 대한
  6. 가 dll 버전 관리 문제를 이 때마다 우리는 변화는 대중 const 변수 또는 재산,(사실,그것은 변경 될 예정되지 않은 이론적으로)다른 dll 또는 어셈블리를 사용하는 이 변수가 될 것을 다시 건축
  7. 만 C#내장형 선언할 수 있습으로 일정
  8. Const 분야 전달되지 않을 수 있으로 ref 또는 매개변수

ReadOnly

  1. readonly 키워드만 적용됩 필드 지역 변수
  2. 우리가 지정할 수 있습니다 읽기 전용 분야에서의 시간을 선언 또는에서 생성자,지 않은 다른 방법이 있습니다.
  3. 동적 할당된 메모리 읽기 전용 분야이고 우리가 값을 얻을 수 있습니다.
  4. Readonly 개체에 속하도록 만들어를 통해 액세스만의 인스턴스 클래스입니다.그것을 만드는 클래스 구성원을 추가해야 합 static 키워드 앞에 읽기 전용입니다.
  5. 값과 다를 수 있습에 따라 생성자를 사용하는(그것으로 그리고 클래스의 개체)
  6. 당신이 선언하는 기본이 아닌 유형(참조 형)읽기 전용으로만 참조은 변경할 수 없는지 그것이 포함되어 있습니다.
  7. 이 값이에서 얻은 실행 시간이 없 dll 버전 문제와 readonly 드/속성입니다.
  8. 우리는 전달할 수 있습 readonly 필드 ref 또는 생성자에서 매개 변수다.

주로;값을 할당할 수 있습니 정적 readonly 필드를 non-상수 값으로 런타임 시에는 반면,const 가를 할당하고 일정한 값입니다.

A const하드 코딩, 로 readonly설정에서 생성자 의 클래스입니다.

Const 및 읽기 전용 비슷하지만 그들은 정확히 동일하지 않습니다.Const 필드를 컴파일한 의미하는 것에 값을 계산할 수 있는 컴파일 시간입니다.Readonly 분야 할 수 있습 추가 시나리오에있는 일부 코드를 실행해야 합니다 동안 건설 유형입니다.건설 후,readonly 필드를 변경할 수 없습니다.

예를 들어,const 멤버 정의를 사용할 수 있습니다 회원:

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

이 값은 다음과 같 3.14 0 컴파일시 혹은 상수입니다.그러나,고려할 경우 정의 유형과를 제공하려고 일부 pre-fab 의 인스턴스습니다.E.g., 를 정의할 수 있습 색상 클래스고를 제공하"상수는"일반적인 색상 검정,백색,etc.수는 없습니다 이를 위해 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;
    }
}

하지만 아무것도 없을 유지하는 클라이언트의 색깔에서 청소하는 것이 아닙 그것으로,아마도 교환하여 흑인과 백인 값입니다.말할 필요도 없이,이 원인이 경악을 위한 다른 클라이언트의 색상 클래스입니다."Readonly"기능이 시나리오를 해결해 줍니다.단순히 소개 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 회원은 항상 정적이며,구성할 수 있는 정적이거나지 않는,다음과 같은 분야이다.

사용 가능한 하나의 키워드를 위해 이러한 두 가지 목적지만,이것은 하나 버전 문제 또는 성능 문제입니다.하고 있다고 생각해보십시는 우리 사용되는 하나의 키워드로이(const)및 개발자를 썼다:

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

과는 다른 개발자를 썼다는 코드에 의존했:

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

지금 할 수 있는 코드를 생성한다는 사실에 의존하 A.C 컴파일 시간 일정한가?I.e., 의 사용을 가 A.C 단순히 교체하여 값을 0?는 경우 당신은"예"라고 말하는 이는 개발자의할 수 없는 방법이 변경되 A.C 를 초기화되--이 관계 개발자의 없이 권한이 있습니다.을 말한다면"아니오"이 질문에 그 중요한 최적화합니다.아마도 저자의 긍정적 이 A.C 항상 있을 것입니다.의 사용을 모두 const 및 readonly 할 수 있는 개발자의 지정합니다.이렇게 하면 더 잘 동작한 버전 관리도 더 나은 성능을 제공합니다.

ReadOnly:값이 초기화됩 한 번만에서 생성자의 클래스입니다.
const:에서 초기화할 수 있습니다 어떤 기능을 하지만 한 번만

차이가 있다는 것의 가치를 정적 readonly 필드에 설정된 실행 시간,그래서 다른 값을 가질 수 있습에 대한 다른 실행하는 프로그램입니다.그러나 값의 const 필드를 설정하면 컴파일한다.

기억하십시오:에 대한 참조류,두 경우 모두에서(정적 및 인스턴스),readonly modifier 방지만 당신은에서 할당하는 새로운 참조하는 분야이다.그것은 특히지 않게 변경할 수 없는 객체에 지적하여 참조.

자세한 내용을 참조하십시오 C#은 자주 묻는 질문에는 이 항목:http://blogs.msdn.com/csharpfaq/archive/2004/12/03/274791.aspx

일정한 변수를 선언하고 초기화를 하는 c 컴파일러입니다..이 값을 변경할 수 없습 후 영향을 나타내는 것이다.읽기 전용 변수 초기화됩만에서 정의 생성자 클래스입니다.읽기만을 사용할 때에만 우리가 원하는 값을 지정합니다.

한 가지를 추가하는 사람들이 무엇을 말했다.이 있는 경우를 포함하는 어셈블리 readonly 값(예:readonly MaxFooCount=4;),값을 변경할 수 있습니다 그 부름 어셈블리 볼로 배송 새로운 버전으로 다른 값을(예를들면readonly MaxFooCount=5;)

하지만 const,그것은 것으로 접지된 발신자의 코드를 호출자가 되었습니다.

한 경우의 수준에 도달 C#능력,당신은 당신을 위해 준비 청구서 바그너의 예약,효과적인 C#:50 특정을 개선하는 방법 당신의 C# 는 이 질문에 세부사항,(49 다른 것들).

주요 차이점은 Const C 에 해당#DEFINE.수은 말 그대로 가져옵 대체-la 리컴파일러.읽기 전용입니다 실제로 처리하는 변수.

이러한 구분은 특히 관련된 경우가 프로젝트에 따라 대중에서 지속적인 프로젝트 B.가 공정 변경합니다.지금의 당신의 선택 const/readonly 영향을 미칠 것에 동작을 프로젝트:

Const:프로젝트에 잡을 수 없는 새로운 가치(지 않는 한 그것은 다시 컴파일로 새로운 const,of course)이었기 때문에 컴파일된 상수 subtituted 습니다.

ReadOnly:프로젝트는 항상 요청 프로젝트 B 에 대한 그것의 변수 값,그래서 그것은 선택의 새로운 가치 공공정에 B.

솔직히,나는 것이 좋습니다 당신이 사용 읽기 전용한 거의 모든 것을 제외 진정으로 보편적인 상수(예:Pi,Inches_To_Centimeters).아무것도에 대한 가능성이 있는 변화,나는 말을 사용하여 읽기 전용입니다.

이, Alan.

간단한 단어에서 Const 은 컴파일시 및 읽기 전용입니다.

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