2012-03-19 5 views
0

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

public class Mtx 
{ 
    float[] Data; 

    public Mtx(float[] data_in) 
    { 
     Data = (float[])data_in.Clone(); 
    } 
} 

, потому что в противном случае, если я просто сделать это

public class Mtx 
{ 
    float[] Data; 

    public Mtx(float[] data_in) 
    { 
     Data = data_in; 
    } 
} 

Изменение data_in входной аргумент также изменить само поле. Есть глобальное решение этого. Как вы это решаете?

Благодаря

+0

* решайте, не подошва ... –

+1

FYI - В коде, указанном коде, 'Данные' ** поле **, а не ** ** **. – Greg

+0

«Как вы это решаете?» - в зависимости от массивов так много ... –

ответ

0

Я полагаю, что если ваше намерение состоит в том, чтобы предоставить доступ только для чтения к массиву и предотвратить потребитель МОГО от изменения входящего массива, вы могли бы использовать ReadOnlyCollection класс. Хотя для этих коллекций может потребоваться некоторое рефакторинг, поскольку создание нового в конструкторе Mtx (я полагаю) будет по существу копировать данные в ReadOnlyCollection, повторяя работу, выполненную в вашем первом примере кода, в любом случае.

EDIT: Упс, дважды проверенный MSDN. Создание ReadOnlyCollection просто обертывает базовый массив как операцию O (1). Поэтому вы можете сделать это в конструкторе Mtx. Однако, если вы измените переданный массив вне класса, его изменения будут отражены в полученном ReadOnlyCollection. Возможно, это может быть использовано в ваших интересах с вашими конкретными потребностями.

Смежные вопросы