your programing

C #의 "const correctness"

lovepro 2020. 10. 12. 08:00
반응형

C #의 "const correctness"


const-correctness의 요점은 사용자가 변경하거나 삭제할 수없는 인스턴스의 뷰를 제공 할 수 있다는 것입니다. 컴파일러는 const 함수 내에서 constness를 중단하거나 const 개체의 상수가 아닌 함수를 사용하려고 할 때이를 지적하여이를 지원합니다. 따라서 const 접근 방식을 복사하지 않고 동일한 목적을 가진 C #에서 사용할 수있는 방법론이 있습니까?

나는 불변성을 알고 있지만 실제로 컨테이너 객체에 이름을 붙이지는 않지만 하나의 예입니다.


나는이 문제를 자주 접했고 결국 인터페이스를 사용하게되었다.

나는 C #이 어떤 형태 나 심지어 C ++의 진화라는 생각을 버리는 것이 중요하다고 생각합니다. 거의 동일한 구문을 공유하는 두 개의 다른 언어입니다.

일반적으로 클래스의 읽기 전용 뷰를 정의하여 C #에서 'const correctness'를 표현합니다.

public interface IReadOnlyCustomer
{
    String Name { get; }
    int Age { get; }
}

public class Customer : IReadOnlyCustomer
{
    private string m_name;
    private int m_age;

    public string Name
    {
        get { return m_name; }
        set { m_name = value; }
    }

    public int Age
    {
        get { return m_age; }
        set { m_age = value; }
    }
}

const-craziness (또는 함수형 프로그래밍 용어의 순수성)의 이점을 얻으려면 c #의 String 클래스와 마찬가지로 변경 불가능한 방식으로 클래스를 디자인해야합니다.

이 접근 방식은 객체를 읽기 전용으로 표시하는 것보다 훨씬 낫습니다. 불변 클래스를 사용하면 멀티 태스킹 환경에서 쉽게 데이터를 전달할 수 있기 때문입니다.


많은 System.Collections.Generics 컨테이너에는 변경 불가능한 컬렉션을 다시 제공하는 AsReadOnly 메서드가 있다는 점에 유의하고 싶습니다.


C #에는 이러한 기능이 없습니다. 값 또는 참조로 인수를 전달할 수 있습니다. 당신은 지정하지 않는 한 그 자체가 불변 참조 심판 수정합니다. 그러나 참조 된 데이터는 변경할 수 없습니다. 따라서 부작용을 피하려면주의해야합니다.

MSDN :

매개 변수 전달


인터페이스가 해답이며 실제로 C ++의 "const"보다 더 강력합니다. const는 "const"가 "멤버를 설정하지 않거나 멤버를 설정하는 무언가를 호출하지 않음"으로 정의되는 문제에 대한 단일 크기 솔루션입니다. 이것은 많은 시나리오에서 const-ness의 좋은 속기이지만 전부는 아닙니다. 예를 들어, 일부 멤버를 기반으로 값을 계산하지만 결과를 캐시하는 함수를 고려하십시오. C ++에서는 상수가 아닌 것으로 간주되지만 사용자 관점에서는 본질적으로 const입니다.

인터페이스는 클래스에서 제공하려는 기능의 특정 하위 집합을 정의하는 데 더 많은 유연성을 제공합니다. 불변성을 원하십니까? 변경 방법이없는 인터페이스를 제공하십시오. 일부 설정은 허용하고 다른 설정은 허용하지 않습니까? 해당 메소드만으로 인터페이스를 제공하십시오.


불변 객체를 만들기 위해 생성자에서 초기화하는 읽기 전용 필드를 사용하는 다른 사람들의 의견에 동의하십시오.

    public class Customer
    {
    private readonly string m_name;
    private readonly int m_age;

    public Customer(string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    public string Name
    {
        get { return m_name; }
    }

    public int Age
    {
        get { return m_age; }
    }
  }

또는 속성에 대한 액세스 범위를 추가 할 수도 있습니다. 즉, public get 및 protected set?

    public class Customer
    {
    private string m_name;
    private int m_age;

    protected Customer() 
    {}

    public Customer(string name, int age)
    {
        m_name = name;
        m_age = age;
    }

    public string Name
    {
        get { return m_name; }
        protected set { m_name = value; }
    }

    public int Age
    {
        get { return m_age; }
        protected set { m_age = value; }
    }
  }

  • CONST의 키워드는 같은 원시적 형 및 캐릭터 등의 컴파일 시간 상수를 사용할 수 있습니다
  • 읽기 전용 키워드는 참조 유형과 같은 런타임 상수를 사용할 수 있습니다

읽기 전용 의 문제 는 참조 (포인터)가 일정 할 수만 있다는 것입니다. 참조 된 (가리키는) 것은 여전히 ​​수정할 수 있습니다. 이것은 까다로운 부분이지만 주위에 방법이 없습니다. 상수 객체를 구현한다는 것은 변경 가능한 메서드 나 속성을 노출하지 않도록하는 것을 의미하지만 이것은 어색합니다.

See also Effective C#: 50 Specific Ways to Improve Your C# (Item 2 - Prefer readonly to const.)

참고URL : https://stackoverflow.com/questions/114149/const-correctness-in-c-sharp

반응형