Я столкнулся с этой проблемой много времен также и закончил тем, что использовал интерфейсы.
я думаю, что важно отбросить идею, что 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; }
}
}
Для извлечения пользы из сумасшествия константы (или чистота в условиях функционального программирования) необходимо будет разработать классы способом, таким образом, они будут неизменны, точно так же, как Строковый класс c#.
Этот подход является путем лучше, чем просто маркировка объекта как только для чтения, с тех пор с неизменными классами можно раздать данные легко в многозадачных средах.
Я просто хотел отметить Вами что многие из Системы. Наборы. Контейнеры дженериков имеют метод AsReadOnly, который даст Вам, поддерживают неизменный набор.
C# не имеет такой функции. Можно передать аргумент значением или ссылкой. Сама ссылка неизменна, если Вы не определяете касательно модификатор. Но справочные данные не неизменны. Таким образом, необходимо быть осторожными, если Вы хотите избежать побочных эффектов.
MSDN:
Интерфейсы являются ответом и на самом деле более мощны, чем "константа" в C++. константа является единым решением проблемы, где "константа" определяется, поскольку "не делает элементов множества или называют что-то, что устанавливает участников". Это - хорошая стенография для мыса константы во многих сценариях, но не всех них. Например, рассмотрите функцию, которая вычисляет значение на основе некоторых участников, но также и кэширует результаты. В C++ это рассмотрело неконстанту, хотя с точки зрения пользователя это - по существу константа
, Интерфейсы дают Вам больше гибкости в определении определенного подмножества возможностей, которые Вы хотите обеспечить от своего класса. Хотите мыс константы? Просто обеспечьте интерфейс без видоизменяющихся методов. Хотите позволить устанавливать некоторые вещи, но не других? Предоставьте интерфейсу просто те методы.
Согласуйте с некоторыми из других взгляд на использование полей только для чтения, которые Вы инициализируете в конструкторе, для создания неизменных объектов.
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; }
}
}
, проблема с только для чтения состоит в том, что это только позволяет ссылке (указатель) быть постоянной. Вещь, на которую ссылаются, (указала), может все еще быть изменен. Это - хитрая часть, но нет никакого пути вокруг этого. Реализовать постоянные объекты означает заставлять их не представить изменяемые методы или свойства, но это является неловким.
См. также Эффективный C#: 50 Особенных методов Улучшить Ваш C# (Объект 2 - Предпочитают только для чтения константе)