Вопрос

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

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

Это было полезно?

Решение

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

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

Обычно я выражаю "постоянную корректность" в C #, определяя представление класса только для чтения:

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-сумасшествия (или чистоты в терминах функционального программирования), вам нужно будет спроектировать свои классы таким образом, чтобы они были неизменяемыми, точно так же, как класс String в c #.

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

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

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

MSDN:

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

Интерфейсы - это ответ, и на самом деле они более мощные, чем "const" в C ++.const - это универсальное решение проблемы, где "const" определяется как "не устанавливает члены или не вызывает что-то, что устанавливает члены".Это хорошее сокращение для обозначения постоянства во многих сценариях, но не во всех из них.Например, рассмотрим функцию, которая вычисляет значение на основе некоторых элементов, но также кэширует результаты.В 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; }
    }
  }

В качестве альтернативы вы также могли бы добавить область доступа к свойствам, т.е.общедоступный get и защищенный 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; }
    }
  }
  • Тот Самый постоянный ключевое слово может использоваться для констант времени компиляции, таких как примитивные типы и строки
  • Тот Самый только для чтения ключевое слово может использоваться для констант времени выполнения, таких как ссылочные типы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top