Это хорошая практика неизменности? - PullRequest
0 голосов
/ 07 марта 2011

Доброе утро,

Предположим, у меня есть класс

public class Class
{
    int something;
    int[] otherThing;
}

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

public Class SomeFunction()
{
    int[] Temp = new int[] { ... };

    return new Class(1, Temp);
}

Чтобы не создавать новые объекты слишком часто, и поскольку Temp больше не доступен из метода, слишком плохо устанавливать конструктор

this.otherThing = Temp;

вместо

otherThing = new uint[Temp.Length];

for (int i = 0; i < Temp.Length; i++)
{
    this.otherThing[i] = Temp[i];
}

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 07 марта 2011

Если конструктор, который делает это, является частным, то это нормально IMO.Поскольку вы знаете, что содержимое другого массива никогда не изменится, вы можете использовать его напрямую.Вы можете даже разделить один экземпляр массива между несколькими экземплярами вашего класса, если хотите, не вызывая никаких проблем.

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

2 голосов
/ 07 марта 2011

Лучше назначить копию temp для otherThing, чтобы любые изменения в otherThing не изменили temp. Для этой цели вы также можете использовать метод Array.CopyTo.

Кроме того, вы должны серьезно рассмотреть возможность использования IEnumerable<int> или IList<int> вместо int[], поскольку массивы по своей природе работают против идеи неизменности. Прочтите этот пост Эрика Липперта .

0 голосов
/ 07 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...