“правильность константы” в C#

78
задан TylerH 21 January 2017 в 05:28
поделиться

7 ответов

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

я думаю, что важно отбросить идею, что 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; }
    }
}
62
ответ дан Peter Mortensen 24 November 2019 в 10:37
поделиться

Для извлечения пользы из сумасшествия константы (или чистота в условиях функционального программирования) необходимо будет разработать классы способом, таким образом, они будут неизменны, точно так же, как Строковый класс c#.

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

28
ответ дан Sam 24 November 2019 в 10:37
поделиться

Я просто хотел отметить Вами что многие из Системы. Наборы. Контейнеры дженериков имеют метод AsReadOnly, который даст Вам, поддерживают неизменный набор.

23
ответ дан Rick Minerich 24 November 2019 в 10:37
поделиться

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

MSDN:

Передающие Параметры

4
ответ дан aku 24 November 2019 в 10:37
поделиться

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

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

3
ответ дан munificent 24 November 2019 в 10:37
поделиться

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

    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; }
    }
  }
3
ответ дан Stuart McConnell 24 November 2019 в 10:37
поделиться
  • константа ключевое слово может использоваться для констант времени компиляции, таких как типы примитивов и строки
  • только для чтения , ключевое слово может использоваться для констант этапа выполнения, таких как ссылочные типы

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

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

2
ответ дан Thomas Bratt 24 November 2019 в 10:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: