Поскольку неизменяемость не полностью испечена на С# до степени, указанной в F #, или полностью в рамках (BCL), несмотря на некоторую поддержку в CLR, то какое довольно полное решение для (im) изменчивости для С#?
Мой порядок предпочтения - это решение, состоящее из общих паттернов/принципов, совместимых с
- отдельная библиотека с открытым исходным кодом с несколькими зависимостями
- небольшое количество дополнительных/совместимых библиотек с открытым исходным кодом
- что-то коммерческое
что
- охватывает типы Lippert immutability
- предлагает достойную работу (ту неопределенную, которую я знаю)
- поддерживает сериализацию
- поддерживает клонирование/копирование (глубокое/мелкое/частичное?)
- чувствует себя естественным в таких сценариях, как DDD, шаблоны компоновщика, конфигурация и потоки.
- предоставляет неизменяемые коллекции
Я также хотел бы включить шаблоны, которые могут возникнуть у сообщества, которые не подходят в рамках, таких как выражая намерение мутирования через интерфейсы ( где оба клиента, которые не должны что-то менять и могут что-то изменить, могут делать это только через интерфейсы, а не для класса поддержки (да, я знаю, что это не истинная неизменность, но достаточная):
public interface IX
{
int Y{ get; }
ReadOnlyCollection<string> Z { get; }
IMutableX Clone();
}
public interface IMutableX: IX
{
new int Y{ get; set; }
new ICollection<string> Z{ get; } // or IList<string>
}
// generally no one should get ahold of an X directly
internal class X: IMutableX
{
public int Y{ get; set; }
ICollection<string> IMutableX.Z { get { return z; } }
public ReadOnlyCollection<string> Z
{
get { return new ReadOnlyCollection<string>(z); }
}
public IMutableX Clone()
{
var c = MemberwiseClone();
c.z = new List<string>(z);
return c;
}
private IList<string> z = new List<string>();
}
// ...
public void ContriveExample(IX x)
{
if (x.Y != 3 || x.Z.Count < 10) return;
var c= x.Clone();
c.Y++;
c.Z.Clear();
c.Z.Add("Bye, off to another thread");
// ...
}