"const correctness" в С#

Точка const-correctness должна обеспечивать представление экземпляра, который пользователь не может изменять или удалять. Компилятор поддерживает это, указывая, когда вы нарушаете константу изнутри функции const или пытаетесь использовать неконстантную функцию объекта const. Итак, не копируя подход const, существует ли методология, которую я могу использовать в С#, которая имеет те же цели?

Я знаю неизменность, но на самом деле это не переносится на контейнерные объекты, но только один пример.

Ответ 1

Я слишком часто сталкивался с этой проблемой и заканчивал использование интерфейсов.

Я думаю, что важно отказаться от идеи о том, что С# - любая форма или даже эволюция С++. Это два разных языка, которые имеют почти одинаковый синтаксис.

Я обычно выражаю "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; }
    }
}

Ответ 2

Чтобы получить выгоду от const-craziness (или чистоты в функциональных терминах программирования), вам нужно будет проектировать свои классы таким образом, чтобы они были неизменными, как и класс String С#.

Этот подход лучше, чем просто пометить объект как readonly, поскольку с неизменяемыми классами вы можете легко передавать данные в многозадачных средах.

Ответ 3

Я просто хотел отметить для вас, что многие из контейнеров System.Collections.Generics имеют метод AsReadOnly, который вернет вам неизменную коллекцию.

Ответ 4

С# не имеет такой функции. Вы можете передать аргумент по значению или по ссылке. Ссылка сама по себе является неизменной, если вы не укажете модификатор ref. Но ссылочные данные не являются неизменными. Поэтому вам нужно быть осторожным, если вы хотите избежать побочных эффектов.

MSDN:

Передача параметров

Ответ 5

Интерфейсы - это ответ и на самом деле более мощный, чем "const" в С++. const является решением для решения всех проблем, где "const" определяется как "не устанавливает членов или не вызывает то, что устанавливает элементы". Это хорошая стенография для константы во многих сценариях, но не для всех. Например, рассмотрим функцию, которая вычисляет значение на основе некоторых элементов, но также кэширует результаты. В С++, который считается неконстантным, хотя с точки зрения пользователя он по существу const.

Интерфейсы дают вам больше гибкости в определении определенного подмножества возможностей, которые вы хотите предоставить из своего класса. Хотите константы? Просто обеспечьте интерфейс без мутирующих методов. Хотите разрешить некоторые вещи, но не другие? Предоставьте интерфейс только с этими методами.

Ответ 6

Согласитесь с некоторыми из других, посмотрите на использование полей readonly, которые вы инициализируете в конструкторе, для создания неизменяемых объектов.

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

Ответ 7

  • Ключевое слово const может использоваться для констант времени компиляции, таких как примитивные типы и строки
  • Ключевое слово readonly может использоваться для констант времени выполнения, таких как типы ссылок

Проблема с readonly заключается в том, что она только позволяет ссылку (указатель) быть постоянной. Указанная вещь (указана) может быть изменена. Это сложная часть, но вокруг нее нет никакого способа. Для реализации постоянных объектов означает, что они не предоставляют каких-либо изменяемых методов или свойств, но это неудобно.

См. также Эффективный С#: 50 конкретных способов улучшить ваш С# (пункт 2 - Предпочитаете только чтение в const).