Еще один вопрос о неизменных объектах - PullRequest
2 голосов
/ 13 марта 2011

Доброе утро, день или ночь,

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

public class SomeClass
{
    uint   SomeField1;
    uint[] SomeField2;

    (...)
}

и ряд неизменных объектов A1, A2, ... типа SomeClass, отличающихся, например, only на SomeField1, не так ли хорошая практика устанавливать SomeField2 во всех них, указывая на одно и то же место в памяти, или мне следует использовать дублирование массива в конструкторах, даже если я знаю, что объекты неизменны?

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

Ответы [ 4 ]

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

"Человек" Эрик Липперт имеет отличное сообщение в блоге , посвященное мелкой и глубокой неизменности и неизменности наблюдений, это, кажется, лежит в основе вашего вопроса.Если вы использовали ссылку на массив в своем конструкторе и не создали свою собственную копию массива, у вас была бы только «мелкая» неизменность.

Поле ints является «мелко» неизменным.Вы можете полагаться на то, что он в некоторой степени неизменен, но как только вы достигнете точки, в которой есть ссылка на изменяемый объект, все ставки отменяются.

Очевидно, что противоположностью мелкой неизменности является «глубокая» неизменность;в глубоко неизменяемом объекте он неизменен до конца.

В вашем случае SomeField2 также будет иметь неизменяемость в наблюдениях: с точки зрения любого вызывающего абонента поле будет неизменным (при условии, что выне предоставляйте прямой доступ к нему, как указал @Slaks) - если кто-то еще не изменит массив, на который вы ссылаетесь.Если вы гарантируете , что этот массив никогда не изменится, это все, что вам нужно - это будет одно из применений шаблона веса в полете .

1 голос
/ 14 марта 2011

Если вы можете гарантировать , что ни один потребитель вашего объекта никогда не мутирует массив, тогда вы можете безопасно использовать массив, как вы описываете. Тем не менее, это похоже на игру с огнем. В этом случае я был бы сильно склонен сделать поле ReadOnlyCollection<uint>, которое оборачивает массив; таким образом вы получаете (1) хорошую ясную документацию «в коде», что эта коллекция доступна только для чтения, и (2) исключение, если кто-то пытается нарушить доступ только для чтения.

1 голос
/ 13 марта 2011

В вашем старом вопросе Это хорошая практика неизменности? Я уже сказал:

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

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

1 голос
/ 13 марта 2011

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

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